3 Replies Latest reply on Jun 28, 2013 5:41 AM by ahmehri

    JBPM 5, WorkItemHandler as a Spring Bean

    valgoerad

      Hello. Is there a way to register domain specific work item handlers via Spring configuration? There is an example in the manual on how to create such nodes: https://hudson.jboss.org/hudson/job/jBPM5/lastSuccessfulBuild/artifact/target/jbpm-5.0-SNAPSHOT-docs-build/jbpm-docs/html_single/index.html#d0e1542

       

      But I would like to inject EmailService to NotificationWorkItemHandler via Spring instead of doing this call:

       

       

      {code:java}

           EmailService service = ServiceRegistry.getInstance().getEmailService();

      {code}

       

      In order to do so, I need to register this handler as a Spring bean and iject it via application context. My configuration at the moment is as follows:

       

       

          <drools:kbase id="knowledgeBase">
              <drools:resources>
                  <drools:resource type="BPMN2" source="classpath:jbpm/churn/PodpowiadaczOfert.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple01.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple02.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple03.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple04.jbpmn" />
              </drools:resources>
              <drools:configuration>
                  <!--<drools:multithread enabled="true" max-threads="5" /> -->
                  <!--<drools:consequenceExceptionHandler handler="pl.cyfrowypolsat.workflow.SimpleException" /> -->
              </drools:configuration>
          </drools:kbase>
          <drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="knowledgeBase">
              <drools:configuration>
                  <drools:jpa-persistence>
                      <drools:transaction-manager ref="transactionManager" />
                      <drools:entity-manager-factory ref="entityManagerFactory" />
                  </drools:jpa-persistence>
              </drools:configuration>
          </drools:ksession>    <drools:kbase id="knowledgeBase">
              <drools:resources>
                  <drools:resource type="BPMN2" source="classpath:jbpm/churn/PodpowiadaczOfert.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple01.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple02.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple03.bpmn" />
                  <drools:resource type="BPMN2" source="classpath:jbpm/simple04.jbpmn" />
              </drools:resources>
              <drools:configuration>
                  <!--<drools:multithread enabled="true" max-threads="5" /> -->
                  <!--<drools:consequenceExceptionHandler handler="pl.cyfrowypolsat.workflow.SimpleException" /> -->
              </drools:configuration>
          </drools:kbase>
          <drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="knowledgeBase">
              <drools:configuration>
                  <drools:jpa-persistence>
                      <drools:transaction-manager ref="transactionManager" />
                      <drools:entity-manager-factory ref="entityManagerFactory" />
                  </drools:jpa-persistence>
              </drools:configuration>
          </drools:ksession>

      {code:xml}

          <drools:kbase id="knowledgeBase">         <drools:resources>             <drools:resource type="BPMN2" source="classpath:jbpm/simple01.bpmn" />         </drools:resources>         <drools:configuration>             <drools:multithread enabled="true" max-threads="5" />         </drools:configuration>     </drools:kbase>     <drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="knowledgeBase">         <drools:configuration>             <drools:jpa-persistence>                 <drools:transaction-manager ref="transactionManager" />                 <drools:entity-manager-factory ref="entityManagerFactory" />             </drools:jpa-persistence>         </drools:configuration>     </drools:ksession>

      {code}

       

      How would I go about registering custom item handlers in the Session's WorkItemManger?

       

       

      {code:java}

           ksession.getWorkItemManager().registerWorkItemHandler("Notification", new NotificationWorkItemHandler());

      {code}

        • 1. Re: JBPM 5, WorkItemHandler as a Spring Bean
          valgoerad

          Here's the solution:

           

          {code:xml}

              <drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="knowledgeBase">         <drools:configuration>             <drools:work-item-handlers>                 <drools:work-item-handler name="Notification" ref="refToNotificationWorkItemHandler" />             </drools:work-item-handlers>             <drools:jpa-persistence>                 <drools:transaction-manager ref="transactionManager" />                 <drools:entity-manager-factory ref="entityManagerFactory" />             </drools:jpa-persistence>         </drools:configuration>     </drools:ksession>

          {code}

          • 2. Re: JBPM 5, WorkItemHandler as a Spring Bean
            michelemauro

            That's very interesting. But what if I have to recover a persistent session from the database, knowing its id?

            • 3. Re: JBPM 5, WorkItemHandler as a Spring Bean
              ahmehri

              Doing that (recover a persistent session from the database) doesn't have any relationship with the subject of this discussion.