ProcessEventListener

时间:2015-05-04 20:23:23

标签: jbpm

使用最新版本6.2的JBPM相当新。我正在尝试建立一个过程,通过该过程,我可以在打开某些(自定义)任务类型时为遗留平台调用REST API,并在将来某个时候通过异步过程再次进行调用。

在高级别,过程应该是这样的:

传统应用 - > (REST)JBPM" StartProcess" - > (REST)Legacy App" Task A Created"

传统应用 - > (REST)JBPM"完成任务A" - > (REST)Legacy App"任务A已完成" &安培;旧应用程序(REST)"任务B已创建"

我创建并注册了一个ProcessEventListener,并在AfterNodeTriggered事件中创建了一个钩子来调用某种类型的节点。我还创建了一个自定义的WorkItem定义并添加了我可以在我注册的WorkItemHandler中访问的参数。我遇到的问题是我需要我的ProcessEventListener来检索我的WorkItem的每个实例(来自Legacy App)的唯一ID,并在调用WorkItemHander之前将其附加到该WorkItem。我可以通过访问getParameter(' key')来完成WorkItem时在WorkItemHandler中执行此操作,但我无法确定ProcessEventListener中的方式(或者是否可行)。

可以(以及如何)我:

  1. 访问ProcessEventListener中的workItem(或用户任务)的参数
  2. 确定ProcessEventListener中的节点类型(例如,MyCustomTask与"用户任务"),以便仅为MyCustomTask调用此服务调用。我可以得到Node' event.getNodeInstance()。getNode()'但我不知道节点类型是什么。
  3. 如果远程服务上有任何错误(回滚到触发节点?),则阻止创建CustomTask。
  4. 我很确定答案是我应该根据需要使用abortWorkItem()在WorkItemHandler中执行这两个请求,但我无法确定如何处理相应的异步流程作为WorkItemHandler解决方案的一部分。

    提前感谢任何反馈!

1 个答案:

答案 0 :(得分:0)

这是很多问题,但我会试一试。

是的,但只有在执行后才能满足您的要求。但是在这里它仍然是:

public void afterNodeTriggered(ProcessNodeTriggeredEvent event){
......
  WorkItemNodeInstance wini=(WorkItemNodeInstance)event.getNodeInstance();
  wini.getWorkItem().getParameters()
.....

WorkItemNode node = (WorkItemNode)event.getNodeInstance().getNode();
if(node.getWork().getName().equals("MyCustomTask"){
  .....
}else if(node.getWork().getName().equals("Human Task"){
  ......
}

是的,但如前所述,ProcessEventListener可能不是理想的地方。这不适合胆小的人,但你可以随时在设置代码的某处提供自己的WorkItemNodeInstance实现,在任何进程启动之前,如下所示:

NodeInstanceFactoryRegistry.INSTANCE.register( WorkItemNode.class,new CreateNewNodeFactory( MyCustomWorkItemNodeInstance.class ) );

然后你可能想要覆盖internalTrigger方法,根据你的要求,它可能看起来像这样:

public void internalTrigger(final NodeInstance from, String type) {
    try{
     /*my special custom code*/
        ....
        super.internalTrigger(from, type);
    }catch(MySpecialRemoteException e){
     /*my special custom exception handling*/
    }

根据您的要求,您可能还需要添加自定义ProcessInstanceMarshaller以确保持久进程实例化您的NodeInstance而不是默认进程,因此它确实变得棘手,但它是可行的:

ProcessMarshallerRegistry.INSTANCE.register(RuleFlowProcess.RULEFLOW_TYPE, new MyRuleflowProcessInstanceMarshaller());