【问题标题】:Binding activiti messages and signals to JMS messages将 activiti 消息和信号绑定到 JMS 消息
【发布时间】:2012-12-23 02:26:44
【问题描述】:

我有两个关于 Activiti BPMN 的问题:

1) 如何以编程方式解析消息定义

2) 如何以编程方式捕获intermediateThrowEvent 事件。

我正在开发一个将使用嵌入式 Activiti BPMN 引擎(当前版本为 5.11)的项目。该应用程序目前由发送和接收 JMS 消息驱动,我认为将它们公开为 Activiti 消息和信号是很自然的。应用程序必须启用许多单独的 JVM,每个 JVM 运行一个具有各种进程的单个 BPMN 引擎,以便在彼此之间发送和接收消息。

我对如何实现每个场景有一些想法,但我不确定如何解析来自我的 BPMN 流程的消息以实现选项 2a,并且我不确定如何捕获 middleThrowEvent 以实现选项 1b :

a) 接收消息:

选项 1a - 订阅所有 JMS 消息到达的单个主题,并将 Activiti 消息或 Activiti 信号名称作为有效负载放入 JMS 消息中。当 JMS 消息到达时,我可以查询每个引擎以查看当前哪些执行正在订阅消息,以及需要启动哪些进程:

List<ProcessDefinition> pds= repositoryService.createProcessDefinitionQuery()
  .messageEventSubscription("messageNameInsideJMSPayload")
  .list();

for (ProcessDefinition pd: pds) 
{
    RunBPMProcess.runtimeService.startProcessInstanceByMessage(messageName, 
    di.getId().toString(), processVariables);
}

选项 2a - 订阅直接映射到 Activiti 消息名称或活动信号名称的动态主题。这里棘手的部分是如何解析来自 BPMN 流程的消息或信号名称。我已经设法使用自定义 BpmnParseListener 解析消息引用,但我只能从实现中获取消息引用,而不是消息名称。

pec = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
  if (pec instanceof ProcessEngineConfigurationImpl)
  {

    List<BpmnParseListener> preParseListeners = new ArrayList <>();

    preParseListeners.add(new BPMNMessageAndSignalParser(pontus));


    ((ProcessEngineConfigurationImpl) pec).setCustomPreBPMNParseListeners(preParseListeners );


  }

b) 发送消息:

选项 1b) 理想情况下,我希望捕获中间ThrowEvent,因此我可以将信号作为 JMS 消息发送,但我不知道该怎么做。

我对 Activiti 还很陌生,所以如果我遗漏了任何明显的东西,我深表歉意;另外,这里有一个示例工作流程,只是为了帮助将问题放在上下文中:

<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
             targetNamespace="http://activiti.org/bpmn20" 
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:activiti="http://activiti.org/bpmn">
  <message id="pontusMessage" name="pontusMessage"/>
  <signal id = "pontusSignal" name="pontusSignal"/>
  <process id="test" name="PontusNetworks Test"  isExecutable="true">

    <startEvent id="start"/>

    <sequenceFlow id="flow1" sourceRef="start" targetRef="messageReceiver" />

    <intermediateCatchEvent id="messageReceiver">
        <messageEventDefinition messageRef="pontusMessage" />
    </intermediateCatchEvent>

    <sequenceFlow id="flow2" sourceRef="messageReceiver" targetRef="signalSender">
    </sequenceFlow>


    <intermediateThrowEvent id="signalSender">
        <signalEventDefinition signalRef="pontusSignal" />
    </intermediateThrowEvent>
    <sequenceFlow id="flow3" sourceRef="messageReceiver" targetRef="theEnd2"/>

    <endEvent id="theEnd2" />

  </process>

</definitions>

提前感谢您的任何想法。

【问题讨论】:

    标签: java jms signals message activiti


    【解决方案1】:

    如何以编程方式解析消息定义

    我不确定您的意思是什么,但显然 Activiti 在解析 BPMN 流程定义 XML 时确实具有通知机制。它允许插入一个侦听器,该侦听器将在多个事件中得到通知。

    wrote 对此发表了一篇有趣的文章。当然,通知中心是我们真正希望在未来版本中看到的。

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2016-12-10
      相关资源
      最近更新 更多