[rules-users] Persistence in Drools 6

Steinmetz, Jean-Philippe jpsteinmetz at theworkshop.us.com
Wed May 28 20:22:35 EDT 2014


Hi Charles,

Yes I am using a KieScanner to look for updates. Since I am using Spring I
had to wrap it so that it could be properly initialized and started as a
bean. I didn't include that bit in my original post as it didn't seem
relevant to the problem at hand.

The other reason why I decided to use the bean notation instead of the kie
namespace is so that I could reference the created session as a bean that
could be injected as a property to another bean (the thread class that sets
up the session for my application and actually calls fireAllRules). Perhaps
I was not doing it right but Spring wasn't recognizing anything in the
<kie> tags as a bean I could reference.

In any case, my approach should be identical to setting up the session in
Java directly as follows.

KieServices kieServices = KieServices.Factory.get();
ReleaseId releaseId = kieServices.newReleaseId("mygroup", "myartifact",
"version");
KieContainer kContainer = kieServices.newKieContainer(releaseId);
Environment env = kieServices.newEnvironment();
env.set(ENTITY_MANAGER_FACTORY, entityManagerFactory);
env.set(TRANSACTION_MANAGER, transactionManager);
KieSession kSession = kContainer.newKieSession(env);

This as far as I've read is exactly how the documentation recommends it be
done. It just doesn't actually work for some reason or another.

Jean-Philippe


On Tue, May 27, 2014 at 11:42 PM, Charles Moulliard <ch007m at gmail.com>wrote:

> Hi Jean-Philippe,
>
> To pickup new updates, then you should use KieScanner (part of kie-ci
> project) which allows you to do incremental build if a new kjar has been
> published/released. Here is an example :
> https://github.com/droolsjbpm/drools/blob/master/kie-ci/src/test/java/org/kie/scanner/KieScannerIncrementalCompilationTest.java
>
> Regards,
>
>
>
> On Tue, May 27, 2014 at 7:38 PM, Steinmetz, Jean-Philippe <
> jpsteinmetz at theworkshop.us.com> wrote:
>
>> Hi Charles,
>>
>> Thanks for your reference. I had tried using kie-spring but was unable to
>> use it as it currently does not support creating sessions from a release id
>> and container. I did this in order to be able to pick up on updates to the
>> kjar from maven while the application is running the same way it used to
>> work in Drools 5. Has anyone else with similar needs to mine gotten
>> persistence working?
>>
>> Jean-Philippe
>>
>>
>> On Thu, May 22, 2014 at 11:23 PM, Charles Moulliard <ch007m at gmail.com>wrote:
>>
>>> Hi Jean Philippe,
>>>
>>> I have recently created a project to persist bpmn process using Spring &
>>> JPA / Hibernate. This config is working using kie-spring
>>>
>>>
>>> https://github.com/cmoulliard/droolsjbpm-osgi-examples/blob/master/spring-jbpm-persistence/src/main/resources/META-INF/spring/context.xml
>>>
>>> Regards,
>>>
>>> Charles
>>>
>>>
>>> On Thu, May 22, 2014 at 8:00 PM, Steinmetz, Jean-Philippe <
>>> jpsteinmetz at theworkshop.us.com> wrote:
>>>
>>>> Hello All,
>>>>
>>>> I am trying to set up persistence for a standalone Drools (6.0.1.Final)
>>>> application that uses JPA, Hibernate (4.3.5.Final) and Bitronix (2.1.4) via
>>>> Spring (4.0.3.RELEASE).
>>>>
>>>> On the persistence side everything appears to be set up correctly. For
>>>> my Drools session I use a KieContainer to create a new stateful session
>>>> using an environment set up with the EntityManagerFactory and
>>>> TransactionManager set. The problem that I am experiencing however is that
>>>> nothing is getting persisted to the database. I have poured over the docs
>>>> at least two dozen times and searched the net for anything related.
>>>>
>>>> Here is what my Spring context file looks like when creating the Drools
>>>> session...
>>>>
>>>>     <bean id="kReleaseId" factory-bean="kieServices"
>>>> factory-method="newReleaseId">
>>>>         <constructor-arg index="0" value="groupId"/>
>>>>         <constructor-arg index="1" value="artifactId"/>
>>>>         <constructor-arg index="2" value="1.0-SNAPSHOT"/>
>>>>     </bean>
>>>>     <bean id="kContainer" factory-bean="kieServices"
>>>> factory-method="newKieContainer">
>>>>         <constructor-arg index="0" ref="kReleaseId"/>
>>>>     </bean>
>>>>     <bean id="kEnvironment" factory-bean="kieServices"
>>>> factory-method="newEnvironment">
>>>>         <constructor-arg index="0">
>>>>             <map>
>>>>                 <entry>
>>>>                     <key><util:constant
>>>> static-field="org.kie.api.runtime.EnvironmentName.ENTITY_MANAGER_FACTORY"/></key>
>>>>                     <ref bean="entityManagerFactory"/>
>>>>                 </entry>
>>>>                 <entry>
>>>>                     <key><util:constant
>>>> static-field="org.kie.api.runtime.EnvironmentName.TRANSACTION_MANAGER"/></key>
>>>>                     <ref bean="jtaTransactionManager"/>
>>>>                 </entry>
>>>>             </map>
>>>>         </constructor-arg>
>>>>     </bean>
>>>>     <bean id="kSession" factory-bean="kContainer"
>>>> factory-method="newKieSession">
>>>>         <constructor-arg index="0" ref="kEnvironment"/>
>>>>      </bean>
>>>>
>>>> Since the application is standalone I execute fireAllRules on the
>>>> session at a regular interval (I use this instead of fireUntilHalt as it
>>>> dramatically reduces the CPU load on the machine). With each call I wrap it
>>>> in a transaction. Thus, the code looks as follows:
>>>>
>>>>     while (!Thread.currentThread().isInterrupted()) {
>>>>         // Start a new transaction
>>>>         UserTransaction utx = utx = (UserTransaction)new
>>>> InitialContext().lookup("java:comp/UserTransaction");
>>>>        utx.begin();
>>>>
>>>>         // Tick the session
>>>>         kSession.fireAllRules();
>>>>
>>>>         // Close the transaction
>>>>         utx.commit();
>>>>
>>>>             // Sleep so that other applications can use the CPU
>>>>             try {
>>>>                 Thread.sleep(1);
>>>>             } catch (InterruptedException e) {
>>>>                 // When our sleep is interrupted it's because the
>>>> executor wants us to shut down.
>>>>                 Thread.currentThread().interrupt();
>>>>             }
>>>>         }
>>>>
>>>> When I inspect kSession in the debugger I can see the environment is
>>>> properly set. I have tried digging down into the execute a bit but can't
>>>> find any point at which the TransactionManager or EntityManagerFactory are
>>>> used. As I said above I know Hibernate is set up correctly as well as
>>>> Bitronix. I can see them working just fine in the logs and they definitely
>>>> are hitting the database (and create tables for sessioninfo and
>>>> workingmemory as they should). I just get nothing actually in the database
>>>> stored, ever.
>>>>
>>>> Any help here is appreciated. It seems like it should work but it just
>>>> doesn't.
>>>>
>>>> Thanks in advance,
>>>>
>>>> Jean-Philippe Steinmetz
>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>
>>>
>>>
>>>
>>> --
>>> Charles Moulliard
>>> Apache Committer / Architect @RedHat
>>> Twitter : @cmoulliard | Blog :  http://cmoulliard.github.io
>>>
>>>
>>> _______________________________________________
>>> 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
>>
>
>
>
> --
> Charles Moulliard
> Apache Committer / Architect @RedHat
> Twitter : @cmoulliard | Blog :  http://cmoulliard.github.io
>
>
> _______________________________________________
> 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/20140528/14ca72fa/attachment.html 


More information about the rules-users mailing list