示例工程
初始化脚本
状态机v1.1到v1.2升版脚本-oracle.sql
state_machine_pg-v1.2(1.1升级到1.2).sql
集成依赖
记得配置注解
@EnableCSBRedisCache
@EnableDbStateMachine
@EnableFeignClients({“com.cvte.csb.statemachine”})
集成依赖
springboot 1.5.9
更换或添加
springboot 2.+
更换或添加
说明:如果依赖无法下载,提前配置依赖仓库
https://artifactory.gz.cvte.cn/artifactory/SR_maven_virtual/
基础配置
csb:
mybatis:
basePackage: com.cvte.csb.statemachine.*.mapper
xmlLocation: classpath:mapper/*.xmlswagger:
swagger:
basePackage: com.cvte.csb.statemachine.admin.controller
数据源
spring:
datasource: # 配置持久化
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://pgtest002.gz.cvte.cn:5432/xxx
username: xxx
password: xxx
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select ‘x’ from DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
redis: # 配置分布式锁
host: redis-dev001.gz.cvte.cn
password: xxxx
database: 4
设置打印日志
logging:
level:
tk.mybatis: DEBUG
org.mybatis: DEBUG
com.cvte.csb: DEBUG
#必须加上以下配置
stateMachine.conf.url= 配置服务访问地址,需带上下文(配置信息获取非REST方式,此处填XXX)
stateMachine.conf.feignName= 配置服务的服务名(配置信息获取非REST方式,此处填XXX)
stateMachine.csb.url = csb网关服务访问地址,需带上下文
csb.feignName = CSB-LEGOX/legox(csb网关服务legox服务名)
csb.iac.appId= xxx
csb.iac.appSecret= xxx
启用引擎
@EnableCSB
@EnableCSBRedisCache
@EnableCSBMybatis
@EnableRestStateMachine
@EnableFeignClients({“com.cvte.csb.statemachine”})
public class SampleBootstrap {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(SampleBootstrap.class);
app.run(args);
}
}
配置状态流
流程设计
内置事件编码说明
驳回: handler_refuse
撤回: drafter_return
转办: handler_commission
废弃: drafter_abandon
引擎示例开发
/**
- 开始->起草->单人审核->两人会审(1通过,2通过)->单人审核1->结束
*/
@Test
@Transactional
public void testStatemachineJointTrial1() throws InterruptedException {
String transactionId = “2ddf30914412412113213”;
String statemachine = “ORDER1-YDW”;
OperatingUser operatingUser = new OperatingUser();
operatingUser.setId(“yeduanwang”);
operatingUser.setAccount(“yeduanwang”);
operatingUser.setName(“叶端旺”);
CurrentContext.setCurrentOperatingUser(operatingUser);
//1.状态机启动
stateMachineService.startStateMachineSyncV2(statemachine, transactionId);
EventHeader eventHeader = new EventHeader();
//2.提交,审批记录中操作名称显示”提交-label”
eventHeader.addHeader(EventHeaderConstant.CURRENT_EVENT_LABEL,”提交-label”);
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(“提交”,eventHeader));
eventHeader.removeHeader(EventHeaderConstant.CURRENT_EVENT_LABEL);
//3.单人审核通过
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(“单人审核通过”,eventHeader));
List
ApproverVO approverVO = new ApproverVO(“叶端旺”,”yeduanwang”);
approverVoList.add(approverVO);
stateMachineService.removeJointAuditApprover(transactionId,statemachine,”会审”,approverVoList);
List
ApproverVO approverVO1 = new ApproverVO(“叶端旺”,”yeduanwang”);
approverVoList1.add(approverVO1);
stateMachineService.addJointAuditApprover(transactionId,statemachine,”会审”,approverVoList1);
//把niewei转办给huangweihong
ApproverVO toApprover = new ApproverVO(“huangweihong”,”huangweihong”,”huangweihong”,null);
ApproverVO fromApprover = new ApproverVO(“niewei”,”niewei”,”niewei”,null);
stateMachineService.updateApproverV2(transactionId,toApprover,fromApprover,null);
StateMachineTask task = stateMachineTaskService.getStateMachineTaskByTransaction(transactionId);
operatingUser.setId(“huangweihong”);
operatingUser.setAccount(“huangweihong”);
operatingUser.setName(“黄威鸿”);
CurrentContext.setCurrentOperatingUser(operatingUser);
//4.会审通过-用户1
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(“会审通过”,eventHeader));
//4.会审通过-用户2
OperatingUser operatingUser1 = new OperatingUser();
operatingUser1.setId(“yeduanwang”);
operatingUser1.setAccount(“yeduanwang”);
operatingUser1.setName(“叶端旺”);
CurrentContext.setCurrentOperatingUser(operatingUser1);
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(“会审通过”,eventHeader));
//获取用户当前按钮
List
EventBtnDTO returnDto = eventBtnDTOS.get(1);
eventHeader.addHeader(EventHeaderConstant.CURRENT_STATE_NAME,returnDto.getCurrentStateCode());
if(StringUtils.isNotEmpty(returnDto.getTargetStateCode())){
eventHeader.addHeader(EventHeaderConstant.STATE_GOD_TARGET,returnDto.getTargetStateCode());
}
//5.撤回审批 (用户yeduanwang)
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(returnDto.getCode(), eventHeader));
//6.会审通过 (用户yeduanwang)
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(“会审通过”,eventHeader));
List
//驳回前,获取所有可驳回的节点
List
String refuseNode = allPreTaskLog.get(2).getSourceState();
EventBtnDTO refuseDto = refusetnDTOS.get(0);
eventHeader.addHeader(EventHeaderConstant.CURRENT_STATE_NAME,refuseDto.getCurrentStateCode());
eventHeader.addHeader(EventHeaderConstant.STATE_GOD_TARGET,refuseNode);
eventHeader.addHeader(EventHeaderConstant.HANDLER_EVENT_TRAIT,”研发工程师”);
eventHeader.addHeader(EventHeaderConstant.HANDLER_REFUSE_USER,”yeduanwang”);
//7.驳回到会审节点(内部节点为 研发工程师,审核人为 yeduanwang)
stateMachineService.dispatchEventV2(transactionId, new DefaultEvent(SysEventType.HANDLER_REFUSE.getCode(), eventHeader));
}
会审节点注意事项:
1、上帝事件跳入会审节点不触发会审初始化动作
解决办法:
拦截器继承抽象类 AbstractJointTrialInterceptor ,并调用 super.postStateChange(stateMachine,converter)
例:
@Component
public class XxxInterceptor extends AbstractJointTrialInterceptor{
……
@Override
public void postStateChange(StateMachine stateMachine, Converter converter) {
super.postStateChange(stateMachine,converter);
…. 业务系统逻辑
}
……
自定义配置缓存逻辑:
问题:获取配置接口频繁调用,导致响应变慢。
解决办法
实现接口方法getConfig、saveConfig自定义缓存逻辑
实现类添加@Component,注入spring容器
例:
@Component
public class XXXConfCacheService implements ConfCacheService {
@Override
public StateMachineDbConfig getConfig(String machineCode, String versionNo) {
return 获取缓存中的配置信息;
}
@Override
public void saveConfig(String machineCode, String versionNo, StateMachineDbConfig config) {
保存模板配置信息到缓存;
}
}
最后编辑:叶端旺 更新时间:2024-12-27 15:01