项目需求:
业务场景中,需要在主流程的某个节点,启动一个消息启动的事件子流程,要求主流程触发子流程后,主流程不等子流程完成,直接继续流转。
实现思路:
由于要异步启动子流程,所以需要引入一个中间无抛出事件,在中间无抛出事件中写监听器,触发事件子流程启动。
代码实现
按照常规思路,message启动的流程需要使用以下代码触发:
runtimeService.startProcessInstanceByMessage("messageName", variables);
以上代码无法启动事件子流程,会报错,提示找不到Message。
触发当前流程的事件子流程,需要先找到当前实例中的message,再接收消息,所以代码实现如下:
public void sendMessage(String messageName, DelegateExecution delegateExecution){
Execution execution = runtimeService.createExecutionQuery().processInstanceId(delegateExecution.getProcessInstanceId()).messageEventSubscriptionName(messageName).singleResult();
Map<String, Object> variables = delegateExecution.getVariables();
runtimeService.messageEventReceived(messageName, execution.getId(), variables);
}
故,完整实现流程如下:
1、左侧(主流程)的中间无抛出事件中写监听器,监听器表达式:
${triggerProcessListener.sendMessage("message1", execution)}
其中message1需在主流程上提前定义,点击流程画布空白处,在下方消息定义中设置好即可。
2、triggerProcessListener的写法如下:
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.runtime.Execution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class TriggerProcessListener {
@Autowired
private RuntimeService runtimeService;
public void sendMessage(String messageName, DelegateExecution delegateExecution){
Execution execution = runtimeService.createExecutionQuery().processInstanceId(delegateExecution.getProcessInstanceId()).messageEventSubscriptionName(messageName).singleResult();
Map<String, Object> variables = delegateExecution.getVariables();
runtimeService.messageEventReceived(messageName, execution.getId(), variables);
}
}
3、右侧Message启动事件,设置消息引用为message1。
如上设置,即可在流程经过左侧中间无抛出事件时,触发启动右侧事件子流程。