注意:在压力测试过程中出现过websocket 连接未销毁的状况,导致tomcat线程耗尽 平台卡死 无法运行的情况,后续优化改为Netty的websocket,本文仅供参考
背景
终端离线检测报警推送,报警是通过定时任务进行检测,检测终端是否离线,如果终端离线则生成报警信息入库,同时需要向web端登录的管理员进行消息实时推送。所有登录的具有离线终端权限的用户都应收到该报警。
实现构想
通过定时任务轮询来检测终端是否离线,如果离线(判断终端的最后心跳时间),则生成报警消息,并保存至数据库,同时,需要将报警消息推送RabbitMq消息服务器,Web 服务启动时会生成报警消息监听队列,监听Mq中的报警消息,web端的管理人员登录云平台后会和后台建立WebSocket连接,在登录期间,如果监听到消息则通过webSocket将消息推送至前端页面对管理人员进行提醒。
代码实现
CMS定时任务
定时任务采用spring Quartz,
先编写定时任务逻辑代码,在spring 配置文件中 添加包扫描即可
<context:component-scan base-package="com.cms.quartz" />
@Component("alarmTask")
@Transactional
public class AlarmTask {
private static final Logger logger = Logger.getLogger(AlarmTask.class);
@Autowired
private AlarmService alarmService;
/**
* 一分钟执行一次
*/
@Scheduled(cron="0 0/1 * * * ?")
public void createAlarm(){
try {
alarmService.createAlarm();
} catch (Exception e) {
}
}
}
RabbitMQ生产者
由于所有登录的具有离线停车场权限的用户都应收到该报警,所以报警消息采用fanout(广播)模式,广播模式模型:
生产者端只需要在配置spring-rabbit配置文件中声明一个广播的交换路由即可:
<rabbit:fanout-exchange name="mq.remoteParkAlarmMsg" durable="fal