1、消息系统做事件驱动
2、spring stateMachine做状态转换控制
3、在listener中作持久化到db2表
spring-boot-starter-redis做应用级缓存
spring boot做整合
状态机引擎选型
https://segmentfault.com/a/1190000009906317
事件驱动好处:
1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.
事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。
4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。
5.事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。
当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。
Disruptor 可以用来代替进程内的 queue。
for (PicCrdInf picCrd : picCrdList) {
if (!StringUtils.isBlank(picCrd.getAppNbr())) {
String appNbr = picCrd.getAppNbr();
String imgPhyId = getPhyIdByAppNbr(appNbr,crdAppImgAttrList);
//没物理Id的直接退出
if (com.cmbchina.cc.framework.utils.StringUtils.isEmptyString(imgPhyId)) {
// log.error("3.1.x.物理ID为空,appNbr:" + appNbr + ", imgPhyId:"+imgPhyId);
continue;
}else{
log.info("3.1.appNbr:" + appNbr + ", imgPhyId:"+imgPhyId);
ImgIdInfDto i = new ImgIdInfDto(picCrd.getCrdOrdNbr(), imgPhyId);
executor.execute(new DownPicTsk(insta, picCrd, i));
cntTask++;
}
}
}
//所有下载完成才退出
while (true) {
// log.info("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
// executor.getQueue().size()+",已执行完成的任务数目:"+executor.getCompletedTaskCount());
log.info(String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s",
executor.getPoolSize(),
executor.getCorePoolSize(),
executor.getActiveCount(),
executor.getCompletedTaskCount(),
executor.getTaskCount(),
executor.isShutdown(),
executor.isTerminated()));
log.info("crdAppImgAttrList数目:"+crdAppImgAttrList.size()+",cntTask:"+cntTask);
if (crdAppImgAttrList.size() == executor.getCompletedTaskCount()) {
break;
}else{
Thread.sleep(2000);
}
}
ThreadPoolExecutor executor = new ThreadPoolExecutor(coreSize, maxPoolSize, keepAliveSeconds, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(queueCapacity),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()){
@Override
protected void terminated() {
log.info("线程池已处于TERMINATED状态");
}
};