在 ProcessEventListener 中访问节点变量
Access node variables in ProcessEventListener
对 JBPM 相当陌生,使用最新版本的 6.2。我正在尝试建立一个流程,通过该流程我可以在某些(自定义)任务类型打开时调用遗留平台的 REST API,并在它们在某些时候完成时再次通过异步流程未来。
在高层次上,该过程应该类似于:
旧版应用程序 -> (REST) JBPM "StartProcess" -> (REST) 旧版应用程序 "Task A Created"
旧版应用程序 -> (REST) JBPM "Complete Task A" -> (REST) 旧版应用程序 "Task A Completed" & 旧版应用程序 (REST) "Task B Created"
我已经创建并注册了一个 ProcessEventListener,并在 AfterNodeTriggered 事件中创建了一个挂钩来调用特定类型的节点。我还创建了自定义 WorkItem 定义并添加了我可以在注册的 WorkItemHandler 中访问的参数。我遇到的问题是,我需要我的 ProcessEventListener 为我的 WorkItem 的每个实例(从遗留应用程序)检索一个唯一 ID,并在调用 WorkItemHander 之前将其附加到该 WorkItem。我可以在 WorkItemHandler 中执行此操作,同时通过访问 getParameter('key') 完成 WorkItem,但我无法确定在 ProcessEventListener 中如何(或是否可能)。
我可以(以及怎么做):
- 在 ProcessEventListener 中访问工作项(或用户任务)的参数
- 确定 ProcessEventListener 中的节点类型(例如 MyCustomTask 与 "User Task"),以便仅为 MyCustomTask 调用此服务调用。我可以得到节点 'event.getNodeInstance().getNode()' 但我不知道节点类型是什么。
- 如果远程服务出现任何错误(回滚到触发节点?),则阻止创建我的 CustomTask。
我相当确定答案是我应该根据需要使用 abortWorkItem() 在 WorkItemHandler 中执行这两个请求,但我无法确定我如何处理相应的异步进程作为 WorkItemHandler 解决方案的一部分。
提前感谢任何反馈!
问题很多,但我会试一试。
是的,但仅在执行后无法满足您的要求。但它仍然在这里:
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());
对 JBPM 相当陌生,使用最新版本的 6.2。我正在尝试建立一个流程,通过该流程我可以在某些(自定义)任务类型打开时调用遗留平台的 REST API,并在它们在某些时候完成时再次通过异步流程未来。
在高层次上,该过程应该类似于:
旧版应用程序 -> (REST) JBPM "StartProcess" -> (REST) 旧版应用程序 "Task A Created"
旧版应用程序 -> (REST) JBPM "Complete Task A" -> (REST) 旧版应用程序 "Task A Completed" & 旧版应用程序 (REST) "Task B Created"
我已经创建并注册了一个 ProcessEventListener,并在 AfterNodeTriggered 事件中创建了一个挂钩来调用特定类型的节点。我还创建了自定义 WorkItem 定义并添加了我可以在注册的 WorkItemHandler 中访问的参数。我遇到的问题是,我需要我的 ProcessEventListener 为我的 WorkItem 的每个实例(从遗留应用程序)检索一个唯一 ID,并在调用 WorkItemHander 之前将其附加到该 WorkItem。我可以在 WorkItemHandler 中执行此操作,同时通过访问 getParameter('key') 完成 WorkItem,但我无法确定在 ProcessEventListener 中如何(或是否可能)。
我可以(以及怎么做):
- 在 ProcessEventListener 中访问工作项(或用户任务)的参数
- 确定 ProcessEventListener 中的节点类型(例如 MyCustomTask 与 "User Task"),以便仅为 MyCustomTask 调用此服务调用。我可以得到节点 'event.getNodeInstance().getNode()' 但我不知道节点类型是什么。
- 如果远程服务出现任何错误(回滚到触发节点?),则阻止创建我的 CustomTask。
我相当确定答案是我应该根据需要使用 abortWorkItem() 在 WorkItemHandler 中执行这两个请求,但我无法确定我如何处理相应的异步进程作为 WorkItemHandler 解决方案的一部分。
提前感谢任何反馈!
问题很多,但我会试一试。
是的,但仅在执行后无法满足您的要求。但它仍然在这里:
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());