Jbpm 6:在每个用户任务的入口处执行 java 代码

Jbpm 6 : Execute java code on entry of every user task

我的要求是在每个用户任务的入口处执行一些 java 代码。参考用户指南,我能够使用 On Entry Action(bpmn) 实现这一点。

由于必须在每个用户任务的入口处执行同一段代码,所以我不想在所有用户任务上都配置它。 jbpm 是否提供任何接口,我可以在其中以编程方式指定 On Entry Action,而不是在 bpmn 中指定每个用户任务。

这里有很多不同的选项。

  1. 如果我从字面上理解你的问题,并且你确定你的要求适用于所有人工任务,那么大锤方法将是通过子类化来拦截 UserTask 进程节点的解析 org.jbpm.bpmn2.xml.UserTaskHandler 并通过覆盖 handleNode 方法注入自定义 OnEntry 操作。这有点棘手,但请查看 org.jbpm.bpmn2.xml.AbstractNodeHandler.handleScript(ExtendedNodeImpl, Element, String) 作为如何操作的示例。不幸的是,这是简单的一点。现在你必须在你自己的 org.jbpm.bpmn2.xml.BPMNSemanticModule 的等效子类中注册你的自定义处理程序,并确保你的实现被使用,这是一个挑战,具体取决于你使用 jBPM 的环境。如果你有兴趣,我可以详细说明,但除非其他方法对你不起作用,我建议不要使用这种方法。

  2. 您还可以注册自己的 org.jbpm.services.task.lifecycle.listeners.TaskLifeCycleEventListener 接口实现。我想你会感兴趣的方法是
    public void beforeTaskAddedEvent(TaskEvent event); 使用此选项,您会丢失 ProcessContext,这意味着您无法轻松访问进程状态,这可能不是您想要的。

  3. 我想说的最好方法是实现您自己的 org.kie.api.event.process.ProcessEventListener 并根据您感兴趣的状态覆盖 void beforeNodeTriggered(ProcessNodeTriggeredEvent event)void afterNodeTriggered(ProcessNodeTriggeredEvent event)。将您的重复逻辑放入这些方法,但确保在调用 getNode() 时只为 return 一个 org.jbpm.workflow.core.node.HumanTaskNode 的 NodeInstances 执行它。 TaskLifecycleEventListener 和 ProcessEventListener 实现都可以在您的 kmodule.xml 文件
  4. 中注册

还有其他选项(参见 ),但它变得棘手。