我的要求是在每个用户任务的条目上执行一些java代码。参考用户指南,我能够使用On Entry Action(bpmn)实现此目的。
由于必须在每个用户任务的条目上执行相同的代码,我不想在所有用户任务上配置它。 有没有jbpm提供的接口,我可以通过编程方式指定On Entry Action,而不是在bpmn中指定每个用户任务。
答案 0 :(得分:3)
这里有很多不同的选择。
如果我完全按照字面意思提出你的问题,如果你确定你的要求适用于所有人类任务,那么大锤方法就是通过继承org.jbpm.bpmn2.xml.UserTaskHandler
来拦截对UserTask进程节点的解析。通过覆盖handleNode
方法注入自定义OnEntry操作。这有点棘手,但请看org.jbpm.bpmn2.xml.AbstractNodeHandler.handleScript(ExtendedNodeImpl, Element, String)
作为如何做的例子。不幸的是,这很容易。现在你必须在你自己的org.jbpm.bpmn2.xml.BPMNSemanticModule
的等效子类中注册你的自定义处理程序,并确保你的实现是一个挑战,这取决于你使用jBPM的环境。如果你有兴趣我可以详细说明,但除非其他方法不适合你,我建议不要采用这种方法。
您还可以注册自己的org.jbpm.services.task.lifecycle.listeners.TaskLifeCycleEventListener
接口实现。我认为您感兴趣的方法是
public void beforeTaskAddedEvent(TaskEvent event)
;
使用此选项,您将丢失ProcessContext,这意味着您无法轻松访问进程状态,这可能不是您要查找的内容。
org.kie.api.event.process.ProcessEventListener
并覆盖void beforeNodeTriggered(ProcessNodeTriggeredEvent event)
或void afterNodeTriggered(ProcessNodeTriggeredEvent event)
,具体取决于您感兴趣的状态。将这些重复出现的逻辑放在这些方法中,但请确保仅在调用org.jbpm.workflow.core.node.HumanTaskNode
时返回实例getNode()
的NodeInstances执行此操作。 TaskLifecycleEventListener和ProcessEventListener实现都可以在kmodule.xml文件中注册还有其他选项(请参阅Access node variables in ProcessEventListener),但这很棘手。