新创造的&已加载的StatefulKnowledgeSession - JBPM 5

时间:2013-04-06 12:44:42

标签: drools jbpm

* 强文 *如果未将任务完成事件分派到StatefulKnowledgeSession,可能会出现什么问题?

对于新的流程实例,我做

  • 创建新会话

    注册人工任务本地GenericHTWorkItemHandler

    注册自定义事件监听器

    致电startProcess(processDefinitionId,parameters);

它启动一个新实例,通过注册的人工任务处理程序创建第一个人工任务。

当我想完成人工任务时,我会

  • 恢复KnowledgeSession JPAKnowledgeService.loadStatefulKnowledgeSession(lastSessionId,kBase,null, env);

    再次注册人工任务本地GenericHTWorkItemHandler

    再次注册自定义事件监听器

然后调用taskService.completeTask,但未将任务完成调度到KnowledgeSession。流程没有发生

我不应该再次注册事件监听器吗? 我不应该再次注册工作项处理程序吗?

更新1 异常跟踪:

07:52:09,618 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/workflow-console].[rsservlet]] (http--0.0.0.0-8280-15) Servlet.service() for servlet rsservlet threw exception: java.lang.IllegalStateException: EntityManager is closed
        at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1158) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
        at org.drools.container.spring.beans.persistence.DroolsSpringJpaManager.getApplicationScopedPersistenceContext(DroolsSpringJpaManager.java:89) [drools-spring-5.5.0.Final.jar:5.5.0.Final]
        at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:350) [drools-persistence-jpa-5.5.0.Final.jar:5.5.0.Final]
        at org.drools.command.impl.CommandBasedStatefulKnowledgeSession.getEnvironment(CommandBasedStatefulKnowledgeSession.java:478) [drools-core-5.5.0.Final.jar:5.5.0.Final]
        at org.jbpm.process.workitem.wsht.GenericHTWorkItemHandler$TaskCompletedHandler.handleCompletedTask(GenericHTWorkItemHandler.java:260) [jbpm-human-task-core-5.4.0.Final.jar:5.4.0.Final]
        at org.jbpm.process.workitem.wsht.GenericHTWorkItemHandler$TaskCompletedHandler.execute(GenericHTWorkItemHandler.java:234) [jbpm-human-task-core-5.4.0.Final.jar:5.4.0.Final]
        at org.jbpm.task.service.local.LocalTaskService$SimpleEventTransport.trigger(LocalTaskService.java:329) [jbpm-human-task-core-5.4.0.Final.jar:5.4.0.Final]

重新加载会话时,我正在注册新的HumanTaskWorkItemhandlers.It继续使用TaskService注册事件处理程序。

当我连接workItemHandlers时,他们使用taskService注册eventHandlers。 这个eventHandlers何时从taskService取消注册?

1 个答案:

答案 0 :(得分:0)

如果您正在使用任务服务,它将默认将事件分派给所有侦听器。这意味着多个ksessions可以接收事件(但任务完成事件应该只由一个ksession处理)。正如您所提到的,使用owningKSessionOnly可以确保只有一个ksession会对完成事件做出反应。

您可以通过在处理程序上调用dispose来取消注册处理程序的侦听器。