WorkItemHandlers as Spring beans in JBPM 6.2 via RuntimeManager
carlone Aug 26, 2015 9:56 AMHi everyone,
i followed Maciej's article to integrate JBPM 6 with Spring framework and everything is working good.
In fact, in my Tomee webapp i'm able to start process and signal events, the transactions are configured well so the AuditLogService is correctly interacting with my PostgreSQL data store.
I access to JBPM layer via RuntimeManager injected in my Spring controller, but now i need to develop some business logic in custom WorkItemHandlers and need to declare them as spring beans in my application-context.xml. So i'm NOT using Jbpm Services.
i read this post and this, but i can't figure out,
I created a class that implements RegisterableItemsFactory called SpringRegisterableItemsFactory
public class SpringRegisterableItemsFactory implements RegisterableItemsFactory { Map<String, WorkItemHandler> workItemHandlers; @Override public Map<String, WorkItemHandler> getWorkItemHandlers( RuntimeEngine runtime) { // TODO Auto-generated method stub return workItemHandlers; } @Override public List<ProcessEventListener> getProcessEventListeners( RuntimeEngine runtime) { // TODO Auto-generated method stub return null; } @Override public List<AgendaEventListener> getAgendaEventListeners( RuntimeEngine runtime) { // TODO Auto-generated method stub return null; } @Override public List<RuleRuntimeEventListener> getRuleRuntimeEventListeners( RuntimeEngine runtime) { // TODO Auto-generated method stub return null; } @Override public Map<String, Object> getGlobals(RuntimeEngine runtime) { // TODO Auto-generated method stub return null; } @Override public List<TaskLifeCycleEventListener> getTaskListeners() { // TODO Auto-generated method stub return null; } public void setWorkItemHandlers(Map<String, WorkItemHandler> workItemHandlers) { this.workItemHandlers = workItemHandlers; } }
in this class i inject my custom WorkItemHandler in this way
<bean id="verificaDatiEnelWorkItemHandler" class="com.sample.workitemhandlers.VerificaDatiEnelWorkItemHandler"> </bean> <bean id="registerableItemsFactory" class="com.sample.SpringRegisterableItemsFactory"> <property name="workItemHandlers"> <map> <entry key="VerificaDatiEnelWorkItemHandler" value-ref="verificaDatiEnelWorkItemHandler" /> </map> </property> </bean>
now i need to register my SpringRegisterableItemsFactory in such way that is configured in runtimeManager. I'm doing it in this way
<bean id="runtimeEnvironment" class="org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean"> <property name="type" value="DEFAULT" /> <property name="entityManagerFactory" ref="jbpmEMF" /> <property name="transactionManager" ref="jbpmTxManager" /> <property name="registerableItemsFactory" ref="registerableItemsFactory" /> <--------- here <property name="assets"> <map> <entry key-ref="process"> <util:constant static-field="org.kie.api.io.ResourceType.BPMN2" /> </entry> </map> </property> </bean> <bean id="runtimeManager" class="org.kie.spring.factorybeans.RuntimeManagerFactoryBean" destroy-method="close"> <property name="identifier" value="spring-rm" /> <property name="runtimeEnvironment" ref="runtimeEnvironment" /> </bean>
It seem to be very simple and linear but i get this ClassCastException:
java.lang.ClassCastException: com.sample.SpringRegisterableItemsFactory cannot be cast to org.kie.internal.runtime.manager.InternalRegisterableItemsFactory
This only work for JBPM 6.1?
Anyone give me a hint?
Thanks
Carlo