Jbpm 6:在每个用户任务的条目上执行java代码

时间:2015-05-22 04:06:22

标签: jbpm

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

由于必须在每个用户任务的条目上执行相同的代码,我不想在所有用户任务上配置它。 有没有jbpm提供的接口,我可以通过编程方式指定On Entry Action,而不是在bpmn中指定每个用户任务。

1 个答案:

答案 0 :(得分:3)

这里有很多不同的选择。

  1. 如果我完全按照字面意思提出你的问题,如果你确定你的要求适用于所有人类任务,那么大锤方法就是通过继承org.jbpm.bpmn2.xml.UserTaskHandler来拦截对UserTask进程节点的解析。通过覆盖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),具体取决于您感兴趣的状态。将这些重复出现的逻辑放在这些方法中,但请确保仅在调用org.jbpm.workflow.core.node.HumanTaskNode时返回实例getNode()的NodeInstances执行此操作。 TaskLifecycleEventListener和ProcessEventListener实现都可以在kmodule.xml文件中注册
  4. 还有其他选项(请参阅Access node variables in ProcessEventListener),但这很棘手。