私はこれらに似ていると思う問題を抱えていますが、私のシナリオは少し異なります。
プロセスインスタンスを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 Task Clientを使用して、タスクを割り当てて完了することです。割り当ては完全に機能しますが、タスクを完了すると次の例外が発生します。
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がnullであるためにスローされます。このフィールドは、JpaPersistenceContextManagerが作成されたときに初期化され、disposeメソッドが呼び出されたときにnullになります。
コメントアウトすることで、タスクを適切に完了することができました
// statefulSession.dispose();
良い解決策ではありません。セッションを永遠に開いたままにすることはできません。
問題の核心は、タスクを完了するときに、すでに破棄されているプロセスの作成に使用されたJpaPersistenceContextManagerを使用しようとすることです。
私の質問は、JpaPersistenceContextManagerを再初期化して、アクティブなentityManagerがあることを確認する方法を教えてください。Mina Task Clientを介して電話をかけているので、JpaPersistenceContextManagerに直接アクセスできないことを忘れないでください。