当前位置: 首页 > 知识库问答 >
问题:

访问ProcessEventListener中的节点变量

农波涛
2023-03-14

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

在较高级别上,该过程应类似于:

旧版应用程序-

旧版应用程序-

我已经创建并注册了一个ProcessEventListener,并在AfterNode触发事件中创建了一个钩子来调用特定类型的节点。我还创建了一个自定义WorkItem定义并添加了可以在我注册的WorkItemHandler中访问的参数。我遇到的问题是我需要我的ProcessEventListener来检索我的WorkItem的每个实例(从旧版应用程序)的唯一ID,并在调用WorkItemHander之前将其附加到该WorkItem。我可以在WorkItemHandler中通过访问getParameter('key')来完成WorkItem,但我无法确定如何(或这是否可能)在ProcessEventListener中。

我可以(以及如何):

  1. 在ProcessEventListener中访问工作项(或用户任务)的参数
  2. 确定ProcessEventListener中的节点类型(例如MyCustomTask与“用户任务”),以便仅为MyCustomTask调用此服务调用。我可以得到Node'event.getNodeInstance(). getNode()',但我不能告诉节点类型是什么。
  3. 如果远程服务出现任何错误(回滚到触发节点?),则阻止创建我的CustomTask。

我很确定答案是,我应该在WorkItemHandler中根据需要使用abortWorkItem()执行这两个请求,但我无法确定如何作为WorkItemHandler解决方案的一部分处理相应的异步进程。

提前感谢任何反馈!

共有1个答案

宰父单弓
2023-03-14

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

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

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());
 类似资料:
  • 我有一个方法可以创建一个带有节点和关系的图。我想将节点ID列表返回给调用方,以便后面的步骤可以快速定位这些节点并创建其他关系。我将无法返回节点实例。 在SQL世界中,我可以返回主键或唯一键。在neo4j的世界里,我应该回报什么?是否有一个唯一的节点标识符,我可以使用,而不会注定自己的地狱第七级?我有自己的身份证吗?由于我沉迷于SQL,我在学习Neo4J方法时遇到了困难。

  • 我需要从一个包含财产细节的网站上取消信息。 “Kandy”和“Rs.3600000”的xpath表示法是什么?

  • 嘿,我一直在研究BFS/DFS,我注意到它们中的许多都有一个轻微的修改,即当一个节点添加到访问集时。 在某种程度上,算法将从堆栈/队列中弹出节点,然后将其添加到访问集。然后它会添加所有没有被访问过的邻居 在另一个实现中,节点不会添加到访问集。相反,它会将所有未访问的邻居添加到堆栈/队列中,但会在将这些邻居添加到堆栈/队列时将其添加到已访问集中。 总之,在一种方法中,当它们弹出到堆栈/队列时,它们被

  • 我正在尝试用mongodb atlas数据库对一个trapi应用程序进行dockerize。我面临的问题是/config中的数据库文件没有从.env文件读取变量。 .env文件 数据库连接代码 我已经尝试使用进程.env,并且在上面的文件中没有它。但是当我在构建后运行映像时,它显示以下错误 error连接到Mongo数据库时出错。URI没有主机名、域名和tld 你知道我在这里做错了什么吗?谢谢

  • 问题内容: 我正在使用Jenkins Build Flow插件来实现并行化。Groovy DSL执行某些文件操作。即使该选项设置为在特定从属服务器上运行作业,但DSL仍在主服务器上运行。这不是故意的。 有人可以告诉我如何限制DSL在指定的从站上运行吗?即使有一种方法可以通过DSL访问从文件系统,也应该可以。 通常,我们如何使用Groovy从Jenkins主节点访问节点从节点上的文件? 工作空间位于

  • 我的Firebase数据库映像在Firebase的实时数据库中,我正在尝试访问父节点的名称,并给出了子节点的名称。但是,.parent似乎需要对子节点的引用,如果没有父节点的名称,我似乎无法获得子节点的引用。 这是我的数据的代码: 问题出在like函数中:如果我能找到一种方法来获取发tweet(参数t表示的tweet)的人的userId,那么第一个var y和所有这些都是不必要的。 如果我可以得到