[
https://issues.jboss.org/browse/JBRULES-2960?page=com.atlassian.jira.plug...
]
Esteban Aliverti commented on JBRULES-2960:
-------------------------------------------
Proposed solution:
Create a new Resource type for this case. This resource type will let you define your
resources present in your classpath as usually but it will translate them to URL Resource
internally.
So, a resource defined as:
<drools:resource type="DRL" source="URLClasspath:simple.drl"/>
is going to be translated (internally and in a transparent way) to something like:
file:/usr/local/apache-tomcat-7/webapps/MyWebapp/WEB-INF/simple.drl.
ClassPathResource fails to get last version if the underlying
ClassLoader uses a cache.
---------------------------------------------------------------------------------------
Key: JBRULES-2960
URL:
https://issues.jboss.org/browse/JBRULES-2960
Project: Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: drools-core
Affects Versions: 5.2.0.M1
Reporter: Esteban Aliverti
Assignee: Esteban Aliverti
Priority: Optional
I'm deploying drools-camel-server in a Tomcat 7 container. Inside the WEB-INF/classes
directory I have some DRL files that I want to use.
My knowledge-services.xml file declares the following kagent:
<drools:kagent id="kagent1" kbase="kbase1"
new-instance="false">
<drools:resources>
<drools:resource type="DRL"
source="classpath:simple.drl"/>
...
</drools:resources>
</drools:kagent>
When spring parses this configuration file it creates a KnowledgeAgent instance with a
ChangeSet containing all the listed resources.
The next step is to start ResourceChangeNotifierService and ResourceChangeScannerService.
So far so good.
The problem:
The problem I'm having is not directly related to drools, but I think it is quite
easy to provide a solution for the people that is in my same situation.
ClassPathResource is the class that represents a resource defined as
"classpath:"
This class has 2 important methods:
public long getLastModified(){
return this.classLoader.getResource( this.path ).openConnection().getLastModified();
}
public InputStream getInputStream(){
return this.classLoader.getResourceAsStream( this.path );
}
The first method is used by ResourceChangeScannerService to check whether the resource
has changed or not. It works fine. When the resource in the filesystem changes, the
scanner detects the change without any problem.
The scanner ends up notifying the kagent about the change, and the kagent passes the
Resource to an instance of KnowledgeBuilder.
An here is when things fail.
The kbuilder uses the second method of ClassPathResource (getInputStream()) to get the
content of the resource. In the case of Tomcat (and probably some other environments), it
seems that the classloader (Tomcat's classloader) is using a cache. So the InputStream
returned doesn't reflect the current state of the resource.
Long story short: the agent is notified about a change in the resource, but the change is
never applied to the kbase because the kbuilder is unable to get it
--
This message is automatically generated by JIRA.
For more information on JIRA, see:
http://www.atlassian.com/software/jira