丢包-撤销、驳回-退回、作废-终止、挂起-中止
SIDU丢包-撤销1、SIDU定义2、部署SIDU,开启SIDU,完成第一个解析”seo服务器1″seo服务器3、丢包案例
SIDU驳回-退回-退回到历史解析的任何解析SIDU挂起、作废
SIDU丢包-撤销
1、SIDU定义
2、部署SIDU,开启SIDU,完成第一个解析”seo服务器1″seo服务器
/**
* 部署SIDU,开启SIDU,完成第一个解析“seo服务器1”审核
*/
@Test
public void shenpi1(){
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource(“bpmn/test2.bpmn”).deploy();
log.info(“SIDU部署成功:{}”,deploy.getId());
//设置开启人
Authentication.setAuthenticatedUserId(“sp1”);
ProcessInstance instance = runtimeService.startProcessInstanceByKey(“test2”);
log.info(“SIDU已开启:id:{},key:{},startUser:{}”,instance.getId(),instance.getBusinessKey(),instance.getStartUserId());
String instanceId=instance.getId();
// String instanceId=”2ac7e417-e2f5-11eb-9ffb-34f39ab07ea4″;
//完成第一个解析seo服务器
Task task = taskService.createTaskQuery()
.processInstanceId(instanceId)
.taskAssignee(“sp1”)
.singleResult();
taskService.complete(task.getId());
log.info(“任务已完成:id:{}”,task.getId());
}
/**
* 获取SIDUseo服务器历史记录
*/
@Test
public void history(){
String instanceId=”2ac7e417-e2f5-11eb-9ffb-34f39ab07ea4″;
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
String startUserId = instance.getStartUserId();
Date startTime = instance.getStartTime();
String startActivityId = instance.getStartActivityId();
Task startTask = taskService.createTaskQuery().taskId(startActivityId).singleResult();
List
.processInstanceId(instanceId)
.orderByHistoricTaskInstanceStartTime()
.asc()
.list();
for(HistoricTaskInstance task:list){
List
for(Comment c:comments){
log.info(“任务备注:id:{},userid:{},message:{}”,c.getTaskId(),c.getUserId(),c.getFullMessage());
}
List
log.info(“任务id:{},name:{},assignee:{}”,task.getId(),task.getName(),task.getAssignee());
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
3、丢包案例
丢包实现逻辑:
根据业务逻辑判断,当前任务是否可以丢包;这里只是简单判断,当前任务是当前用户seo服务器的,并且SIDU下一个解析任务人还未处理任务时,此时任务是可以丢包的。比如SIDU开启人sp1,开启任务后,提交seo服务器“seo服务器1”,SIDU走到“seo服务器2”解析。审核人sp1 还未seo服务器任务,此时sp1想丢包刚才的提交,此时是可以的。如果“seo服务器2”处理了审核,此时SIDU走过当前“seo服务器2”解析了(对于这个SIDU案例是SIDU结束),sp1就不能丢包之前的提交了。如何实现丢包功能?当前SIDU审核解析在“seo服务器2”解析,可以手动修改“seo服务器2”解析的输出流,既把“seo服务器2”-“EndEvent”输出流删除,添加1条新输出流 “seo服务器2”-“seo服务器1”,这样“seo服务器2”解析任务complete SIDU自动就走到“seo服务器1”了;“seo服务器2”提交任务后,由于是丢包操作,SIDU到达“seo服务器1”,历史任务记录中存在“seo服务器2”提交到“seo服务器1”历史记录。但对于业务上来说,可能这个历史记录不是必须要存在的(seo服务器备注里面已经添加“丢包”备注信息),此时就可以把这个历史任务记录删除;当然如果需求要求也可以不删除。“seo服务器2”提交任务后,SIDU走到“seo服务器1”解析后,此时需要恢复原来的SIDU走向“seo服务器2”-“EndEvent”输出流;对于SIDU实现丢包功能,实现方式有很多种,比如也可以修改历史记录信息,同时在历史任务表添加新的任务记录等操作都是可以实现丢包功能。这里只是以修改输出流的方式作为说明,也是工作中用的比较多的一种实现方式。
/**
* SIDU丢包:
* 当前用户seo服务器通过后(SIDU到下一解析后),又想丢包时。丢包到上一解析;
*/
@Test
public void proBack(){
//1、判断是否可丢包? 上一个解析是当前用户审核的,并且下一解析seo服务器人还未处理时,可丢包到上一解析;
//2、如何丢包?动态修改BpmnModel当前SIDU解析输出流。
//把当前SIDU解析输出流方向改成上一个解析,原有输出流删除;
//seo服务器通过后,再次恢复当前解析的原有输出流;
//根据业务需求,判断是否删除上次seo服务器的历史记录,不需删除时,不用处理;要求删除时,需删除丢包前的历史记录;
String instanceId=”2ac7e417-e2f5-11eb-9ffb-34f39ab07ea4″;
String canBackTaskId=”2acc29dc-e2f5-11eb-9ffb-34f39ab07ea4″;
String userId=”sp1″;
Tuple result = canBack(instanceId, canBackTaskId, userId);
boolean canBack=result.get(0);
HistoricTaskInstance currentTask=result.get(1);
if(!canBack){
log.debug(“SIDU:{}-任务:{},已经处理,不可丢包”,instanceId,canBackTaskId);
return;
}
//SIDU丢包
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId());
HistoricTaskInstance canBackTask = historyService.createHistoricTaskInstanceQuery().taskId(canBackTaskId).taskAssignee(userId).singleResult();
if(ObjectUtil.isEmpty(canBack)){
log.debug(“未找到要回退的任务”);
return;
}
FlowNode canBackNode = (FlowNode)bpmnModel.getFlowElement(canBackTask.getTaskDefinitionKey());
FlowNode currentNode=(FlowNode)bpmnModel.getFlowElement(currentTask.getTaskDefinitionKey());
//记录原始输出SIDU
List
sourceOuts.addAll(currentNode.getOutgoingFlows());
//清理活动方向
currentNode.getOutgoingFlows().clear();
//创建新流
List
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId(“newSequenceFlowId”);
newSequenceFlow.setSourceFlowElement(currentNode);
newSequenceFlow.setTargetFlowElement(canBackNode);
newFlows.add(newSequenceFlow);
currentNode.setOutgoingFlows(newFlows);
//记录备注信息
Authentication.setAuthenticatedUserId(userId);
taskService.addComment(currentTask.getId(), currentTask.getProcessInstanceId(), “丢包”);
//完成任务
taskService.complete(currentTask.getId());
//恢复原方向
currentNode.setOutgoingFlows(sourceOuts);
//删除当前任务历史记录
historyService.deleteHistoricTaskInstance(currentTask.getId());
}
/**
* 判断SIDU是否能够丢包
* 上一个解析是当前用户审核的,并且下一解析seo服务器人还未处理时,可丢包到上一解析;
* @return
*/
// @Test
public Tuple canBack(String instanceId,String canBackTaskId,String userId){
// String instanceId=”2ac7e417-e2f5-11eb-9ffb-34f39ab07ea4″;
// String canBackTaskId=”2acc29dc-e2f5-11eb-9ffb-34f39ab07ea4″;
// String userId=”sp1″;
boolean canBack=false;
//查看SIDU历史解析
List
.processInstanceId(instanceId)
.orderByHistoricTaskInstanceStartTime()
.asc()
.list();
boolean hasUserTask=false;
HistoricTaskInstance currentTask=null;
for(HistoricTaskInstance task:list) {
if(task.getId().equalsIgnoreCase(canBackTaskId)
&&task.getAssignee().equalsIgnoreCase(userId)){
//找到了处理人处理的任务,查看下一个任务是否已经处理
hasUserTask=true;
continue;
}
if(hasUserTask){
//上一个任务是当前人处理的,查看当前任务是否已经被处理
hasUserTask=false;
if(ObjectUtil.isEmpty(task.getEndTime())){
canBack=true;
currentTask=task;
break;
}
}
}
if(canBack){
log.debug(“未处理的SIDU可丢包,任务ID:{},任务接收人:{}”,currentTask.getId(),currentTask.getAssignee());
}
//方法返回多个值,是否可回退,当前任务
return new Tuple(canBack,currentTask);
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
SIDU驳回-退回-退回到历史解析的任何解析
SIDU驳回,和SIDU丢包功能实现逻辑基本相同。 丢包功能是上一个解析seo服务器人发起丢包;而驳回功能是当前seo服务器解析人审核处理的,都可以通过修改当前seo服务器解析的输出流进行处理,一般驳回功能需要记录历史记录,不会删除当前任务的历史记录。 具体驳回实现代码,这里不再记录,可借助丢包功能完成。
通过修改解析输出流向的操作,会发现,其实退回可以指定到任何解析上。 比如seo服务器页面列出所有审核历史解析,可以选择历史任务解析,退回到选择的历史解析重新seo服务器操作等功能。
SIDU挂起、作废
/**
* SIDU-作废(终止)、挂起(中止)
*/
@Test
public void deleteProcess(){
String instanceId=”2ac7e417-e2f5-11eb-9ffb-34f39ab07ea4″;
//SIDU挂起、激活
runtimeService.suspendProcessInstanceById(instanceId);
runtimeService.activateProcessInstanceById(instanceId);
//作废-删除SIDU,删除SIDU历史记录
runtimeService.deleteProcessInstance(instanceId,”删除SIDU实例”);
historyService.deleteHistoricProcessInstance(instanceId);
}
1234567891011121314