参考资料

1、消息系统做事件驱动

2、spring stateMachine做状态转换控制

3、在listener中作持久化到db2表

spring-boot-starter-redis做应用级缓存

spring boot做整合

状态机引擎选型  

https://segmentfault.com/a/1190000009906317

扫描二维码关注公众号,回复: 209691 查看本文章

事件驱动好处:

1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.

事件驱动的程序,必定会直接或者间接拥有一个事件队列用于存储未能及时处理的事件
4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。
5.事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。

当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。

 Disruptor 可以用来代替进程内的 queue。

http://ifeve.com/%e8%bd%af%e4%bb%b6%e6%9e%b6%e6%9e%84%e6%a8%a1%e5%bc%8f-%e7%ac%ac%e4%ba%8c%e7%ab%a0%e4%ba%8b%e4%bb%b6%e9%a9%b1%e5%8a%a8%e6%9e%b6%e6%9e%84%e4%b8%8a/

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状态");
             }
  };

猜你喜欢

转载自danni505.iteye.com/blog/2406899