我有一个我认为与这些类似的问题,但我的情况略有不同。
如何使流程实例继续使用 jBPM5?
http://community.jboss.org/message/600654
人工任务 API,如何在工作流中前进? http://community.jboss.org/message/614986#614986
这是我的问题。我使用以下内容创建了一个流程:
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, entityManagerFactory);
InitialContext ctx = new InitialContext();
UserTransaction transactionManager = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
env.set(EnvironmentName.TRANSACTION_MANAGER, transactionManager);
StatefulKnowledgeSession knowledgeSession = JPAKnowledgeService.newStatefulKnowledgeSession(knowledgeBase, null, env);
WorkItemHandler handler = new CommandBasedWSHumanTaskHandler(knowledgeSession);
knowledgeSession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
statefulSession.startProcess(processDefinitionId, processVariables);
statefulSession.dispose(); (Remember this line)
这工作正常。流程已创建,第一个人工任务按预期存在。
我的下一步是使用 Mina 任务客户端,通过任务客户端分配和完成任务。分配工作完美,但是在完成任务时出现以下异常。
SEVERE: Could not commit session
java.lang.NullPointerException
at org.drools.persistence.jpa.JpaPersistenceContextManager.beginCommandScopedEntityManager(JpaPersistenceContextManager.java:67)
at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:287)
at org.drools.command.impl.CommandBasedStatefulKnowledgeSession$1.completeWorkItem(CommandBasedStatefulKnowledgeSession.java:149)
at org.jbpm.process.workitem.wsht.CommandBasedWSHumanTaskHandler$GetResultContentResponseHandler.execute(CommandBasedWSHumanTaskHandler.java:295)
at org.jbpm.task.service.TaskClientHandler.messageReceived(TaskClientHandler.java:153)
at org.jbpm.task.service.mina.MinaTaskClientHandler.messageReceived(MinaTaskClientHandler.java:47)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:713)
这会导致任务完成,但不会创建下一个任务。
抛出此异常是因为 org.drools.persistence.jpa.JpaPersistenceContextManager.appScopedEntityManager 为空。该字段在创建 JpaPersistenceContextManager 时初始化,并在调用 dispose 方法时为空。
通过注释掉,我能够正确完成任务
// statefulSession.dispose();
不是一个好的解决方案。我不能永远保持会话打开。
问题的症结在于,在完成任务时,它会尝试使用用于创建进程的 JpaPersistenceContextManager,该进程已被处理掉。
我的问题是,如何重新初始化 JpaPersistenceContextManager 以确保它具有活动的 entityManager?请记住,我是通过 Mina 任务客户端进行调用的,因此无法直接访问 JpaPersistenceContextManager。