这个还是2017年索道项目里面应用到技术,hession通信,因为就我自己一个人开发,不想搞个rabbitmq之类的消息队列,来实现发布-订阅,解耦业务。这里记录一下。
1 定义事件
这里定义了一个日终处理事件
package com.dzmsoft.monitor.api.event;
import org.springframework.context.ApplicationEvent;
/**
* 日终处理事件
* @author dzm
*/
public class EndProcessEvent extends ApplicationEvent{
private static final long serialVersionUID = 5594301256105426255L;
private Boolean flag;
public EndProcessEvent(Object source) {
super(source);
}
public EndProcessEvent(Object source, Boolean flag) {
super(source);
this.flag = flag;
}
public Boolean getFlag() {
return flag;
}
}
2 触发事件
import org.springframework.context.ApplicationEventPublisher;
@Transactional(readOnly = false)
@Override
public FontalEndProcess deal() {
Date optDate = fontalConfigService.getOptDate();
FontalEndProcess fontalEndProcess = selectByOptDate(optDate);
boolean flag = true;
if (fontalEndProcess == null){
fontalEndProcess = new FontalEndProcess();
fontalEndProcess.setOptDate(optDate);
flag = checkSign(fontalEndProcess, optDate);
if (flag){
fontalEndProcess.setCurrentStep(DealStepEnum.FINISH.value());
// 开始向云端上传日志
EndProcessEvent event = new EndProcessEvent(this, flag);
applicationEventPublisher.publishEvent(event);
}
insertSelective(fontalEndProcess);
} else {
switch(fontalEndProcess.getCurrentStep()){
case 0: case 1:
flag = checkSign(fontalEndProcess, optDate);
break;
case 2:
flag = checkMaintainlog(fontalEndProcess, optDate);
break;
case 3:
flag = nextOptDate(fontalEndProcess, optDate);
break;
case 4:
flag = genNextMaintain(fontalEndProcess, optDate);
break;
case 5:
break;
}
if (flag){
fontalEndProcess.setCurrentStep(DealStepEnum.FINISH.value());
// 开始向云端上传日志
EndProcessEvent event = new EndProcessEvent(this, flag);
applicationEventPublisher.publishEvent(event);
}
updateByPrimaryKeySelective(fontalEndProcess);
}
return fontalEndProcess;
}
3 事件监听
现在springboot的模式应该写法会有变化,第二十七章:SpringBoot使用ApplicationEvent&Listener完成业务解耦,已经4年过了,再回忆之前的技术,发现有些地方已经过时了,这是不是搞技术人员的悲哀呢?你需要像乾卦一样自强不息,努力学习保持进步,但是如果只是应用的话,太容易被淘汰了。
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Async
@Component
public class EndProcessListener implements ApplicationListener<EndProcessEvent>{
@Override
public void onApplicationEvent(EndProcessEvent event) {
if (event.getFlag()){
// 上传运行日志
SyncFontalRunLogJobServiceImpl syncFontalRunLogJobServiceImpl= (SyncFontalRunLogJobServiceImpl)SpringContextHolder.getBean("syncFontalRunLogJobServiceImpl");
syncFontalRunLogJobServiceImpl.sync();
// 上传检查项目
SyncFontalRunLogItemsJobServiceImpl syncFontalRunLogItemsJobServiceImpl= (SyncFontalRunLogItemsJobServiceImpl)SpringContextHolder.getBean("syncFontalRunLogItemsJobServiceImpl");
syncFontalRunLogItemsJobServiceImpl.sync();
// 上传抱索力
SyncFontalGribForceJobServiceImpl syncFontalGribForceJobServiceImpl= (SyncFontalGribForceJobServiceImpl)SpringContextHolder.getBean("syncFontalGribForceJobServiceImpl");
syncFontalGribForceJobServiceImpl.sync();
// 上传维修日志
SyncFontalMaintainLogJobServiceImpl syncFontalMaintainLogJobServiceImpl= (SyncFontalMaintainLogJobServiceImpl)SpringContextHolder.getBean("syncFontalMaintainLogJobServiceImpl");
syncFontalMaintainLogJobServiceImpl.sync();
// 上传停车记录
SyncFontalStopCarJobServiceImpl syncFontalStopCarJobServiceImpl= (SyncFontalStopCarJobServiceImpl)SpringContextHolder.getBean("syncFontalStopCarJobServiceImpl");
syncFontalStopCarJobServiceImpl.sync();
}
}
}