使用最新版本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中的方式(或者是否可行)。
可以(以及如何)我:
我很确定答案是我应该根据需要使用abortWorkItem()在WorkItemHandler中执行这两个请求,但我无法确定如何处理相应的异步流程作为WorkItemHandler解决方案的一部分。
提前感谢任何反馈!
答案 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());