[rules-users] Caching of JBoss Rules bytecode field readers
Mark Proctor
mproctor at codehaus.org
Wed Jul 9 22:05:55 EDT 2008
The getters are generated by this class:
http://fisheye.jboss.org/browse/JBossRules/branches/4.0.x/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java?r=15671
It creates a ClassLoader using the RuleBase classloader as the parent.
The generated classes are also stored in the cache:
http://fisheye.jboss.org/browse/JBossRules/branches/4.0.x/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java?r=15671
However this cache is a singleton so I guess if you have two rulebases
which reference different threads and then you execute on another thread
- the cache is on the executing thread, the code generation on the
referenced threads.
mark
Keith Bennett wrote:
> Thanks for the explanation, Mark. Sorry if it appeared that the focus
> of my poorly worded question was why Strings were used for the key.
> Using Strings makes total sense to me. I was really just trying to
> better understand how caching is implemented to help me better
> understand why I'm having the problem I originally posted about.
>
> Can you explain to me how, through the JBoss Rules API, I can always
> ensure that I'm not picking anything up from an internal cache when I
> deploy new rules? I want to always make sure that the rules from the
> new drl file I place in the classpath are always picked up, not
> anything that was previously cached internally by JBoss Rules.
> Thanks.
>
> Keith
>
> On Wed, Jul 9, 2008 at 9:15 AM, Mark Proctor <mproctor at codehaus.org> wrote:
>
>> We generate bytecode readers for performance, it would be possible to plugin
>> a reflection based reader that would avoid this issue, but we don't have
>> plans to this due to time - we would accept a patch. With regards to why the
>> String for the key, why not? What other key would you imagine we should
>> keep? I guess we could alos look into a classloader specific var to hold the
>> cache.
>>
>> Shows the classes we use to generate field accessors.
>> http://fisheye.jboss.org/browse/JBossRules/tags/4.0.7.19894.GA/drools-core/src/main/java/org/drools/util/asm
>>
>> If you do an import of the project into eclipse you can see where those
>> classes are used from and maybe come up with a solution - please make sure
>> there are no performance loses.
>>
>> Mark
>> Keith Bennett wrote:
>>
>>> I found a link that might explain what is happening with the problem I
>>> described in another posting (included below):
>>> http://jira.jboss.com/jira/browse/JBRULES-1009
>>>
>>> Mark Proctor, if you read this posting, can you please explain in more
>>> detail how and why JBoss Rules generates bytecode field readers and
>>> caches them by string name? I would appreciate it. Could this
>>> explain the issue I'm experiencing as described below?
>>>
>>> I have scoured the documentation and have tried many different
>>> approaches to solving this problem, to no avail. I absolutely can not
>>> get the new version of a .drl file to load with just an application
>>> restart in Tomcat. I have to restart Tomcat each time. In my mind,
>>> this has to be a classloader issue. I just don't know how to get
>>> around it. I would really appreciate any help!
>>>
>>> Keith
>>>
>>>
>>> ---------- Forwarded message ----------
>>> From: Keith Bennett <forthwind at gmail.com>
>>> Date: Wed, Jul 2, 2008 at 9:47 AM
>>> Subject: New rules in source file not loaded when application redeployed
>>> To: Rules Users List <rules-users at lists.jboss.org>
>>>
>>>
>>> I am packaging my rules as a drl source file in a jar that is then
>>> bundled in a war file that is then deployed to Tomcat. In my
>>> implementation, the rulebase is cached the first time it is used in my
>>> application, but when I add new rules to the source file and rebuild
>>> my application then redeploy it on Tomcat, the new version of the
>>> rules don't get loaded into the rulebase.
>>>
>>> Why and how is an older version of the rules being loaded into the
>>> rulebase when I redeploy my application in Tomcat? As FYI, I have
>>> developed a business rules service that initializes the rulebase upon
>>> a Spring container startup by loading the drl file from the classpath.
>>> Is there an internal Drools static cache that is scoped to something
>>> other than my application? The only thing I can do to load the new
>>> rules is restart Tomcat. When I do this, the new version of the drl
>>> source file is loaded and used, so I'm thinking the problem I'm having
>>> is somehow related to the class loaders Tomcat uses, but I can't find
>>> information about what Drools might be doing internally with a static
>>> cache or something like that.
>>>
>>> Can anyone explain what might be happening and how to configure Drools
>>> and/or my application to get around this problem I'm having? I
>>> definitely appreciate any help you can provide!
>>>
>>> Keith
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080710/f9fcb59e/attachment.html
More information about the rules-users
mailing list