Activiti信号场景:
典型场景1:
工单派送-工人接收-工人线下处理后,采用终端激活信号,驱动流程流转。
衍生业务(物流派送、快递送货、消费者收货后,快递终端发信号,驱动物流单状态)
BPM流程图如下:
一、信号事件作用:
信号事件是一个在某阶段一直处于监听某个信号的作用,当接收到某个正在监听的信号时,可执行某项操作
二、简单使用场景:
现需要实现这样一个场景:一个定时的操作,在到某个事件点是执行某个操做,但没到这个时间点前,随时可终止此流程,测试若要实现这个没到某时间点前一直处于监听停止操作的功能就需要用到信号事件(SignalCatchEvent)。要使未接收到信号前流程执行器一直处于监听停止信号的状态,需要用到事件网关(Event Gateway)
ExecutionService executionService=bpmProcessService.bpmRestServices(userId).getExecutionService();
String parentId="";
//
HistoricProcessInstancesQueryParam historicProcessInstancesQueryParam = new HistoricProcessInstancesQueryParam();
historicProcessInstancesQueryParam.setBusinessKey(bussinessKey);
try {
JsonNode jsonNode = (JsonNode) bpmProcessService.bpmRestServices(userId).getHistoryService().getHistoricProcessInstances(historicProcessInstancesQueryParam);
logger.debug(jsonNode.toString());
ArrayNode node = BaseUtils.getData(jsonNode);
List<HistoricProcessInstanceResponse> list = new ArrayList<HistoricProcessInstanceResponse>();
for (int i = 0; node != null && i < node.size(); i++) {
JsonNode jn = node.get(i);
HistoricProcessInstanceResponse resp = jsonResultService.toObject(jn.toString(), HistoricProcessInstanceResponse.class);
list.add(resp);
parentId=resp.getId();
logger.debug("parentId:"+parentId);
}
} catch (RestException e) {
logger.error(e.getMessage(),e);
}
// ProcessInstanceParam processInstanceParam = new ProcessInstanceParam();
// processInstanceParam.setBusinessKey(bussinessKey);
// try {
// Object obj = bpmProcessService.bpmRestServices(userId).getRuntimeService().getProcessInstances(processInstanceParam);
// logger.debug(obj.toString());
// } catch (RestException e) {
// e.printStackTrace();
// }
//---
String executionId="";
try {
ExecutionQueryParam executionQueryParam=new ExecutionQueryParam();
// executionQueryParam.setActivityId("CatchSignalEvent1");
executionQueryParam.setParentId(parentId);//"a0f4ec59-62bf-11e6-9214-b8aeed2e916b"
JsonNode executionsJsonNode = (JsonNode)executionService.getExecutions(executionQueryParam);
logger.debug(executionsJsonNode.toString());
ArrayNode node = BaseUtils.getData(executionsJsonNode);
List<ExecutionResponse> list = new ArrayList<ExecutionResponse>();
for (int i = 0; node != null && i < node.size(); i++) {
JsonNode jn = node.get(i);
ExecutionResponse resp = jsonResultService.toObject(jn.toString(), ExecutionResponse.class);
list.add(resp);
executionId=resp.getId();
logger.debug("parentId:"+parentId);
}
} catch (RestException e) {
e.printStackTrace();
}
//---
ExecutionParam executionParam = new ExecutionParam();
executionParam.setAction(ExecutionParam.SIGNAL_ACTION);
executionParam.setSignalName(signal);
try {
executionService.actionExecutions(executionId,executionParam);//"743233f1-62ad-11e6-9214-b8aeed2e916b"
} catch (RestException e) {
e.printStackTrace();
}
}
BPMN事件汇总如下:
一、
捕获事件:当流程执行到事件, 它会等待被触发。 捕获事件与触发事件在显示方面是根据内部图表是否被填充来区分的(白色的)。
触发事件:当流程执行到事件, 会触发一个事件。 触发事件与捕获事件在显示方面是根据内部图表是否被填充来区分的(被填充为黑色)。
二、
空事件:空
定时器事件:定时器事件是根据指定的时间触发的事件。
错误事件:由指定错误触发的。
信号事件:信号事件会引用一个已命名的信号。信号全局范围的事件(广播语义)。 会发送给所有激活的处理器。
消息事件:消息事件会引用一个命名的消息。每个消息都有名称和内容。和信号不同, 消息事件总会直接发送个一个接受者。
三、
开始事件:开始事件都是捕获事件: 最终这些事件都是(一直)等待着,直到对应的触发时机出现。空、定时、错误、信号、消息
中间事件:捕获(定时、信息、消息) 触发(空、信号、补偿)
边界事件:边界事件都是捕获事件,它会附在一个环节上。 (边界事件不可能触发事件)。这意味着,当节点运行时, 事件会监听对应的触发类型。 当事件被捕获,节点就会中断, 同时执行事件的后续连线。
定时、错误、信号、消息、取消(在事务性子流程的边界上的中间捕获取消, 或简称为边界取消事件 cancel event, 当事务取消时触发。当取消边界事件触发时,首先中断当前作用域的所有执行。 然后开始补偿事务内的所有激活的补偿边界事件。)、补偿(?)
结束事件:结束事件都是触发事件。 这是说当流程达到结束事件,会触发一个结果。
空、错误、取消( 取消结束事件只能与BPMN事务子流程结合使用。 当到达取消结束事件时,会抛出取消事件,它必须被取消边界事件捕获。 取消边界事件会取消事务,并触发补偿机制。)