springboot java redis 监听超时事件
package ideal4j.pfa.config.redis; import cn.hutool.core.date.DateTime; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import ideal4j.icity.common.util.DateUtils; import ideal4j.pfa.common.util.RedisService; import ideal4j.pfa.pfa.model.OverThresholdAlarm; import ideal4j.pfa.pfa.service.OverThresholdAlarmService; import ideal4j.pfa.pfa.service.PassengerFlowAnalysisService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; /** * redis的key过期监听class * */ @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { @Autowired RedisTemplate<String, String> stringRedisTemplate; @Autowired private RedisService redisService; @Autowired OverThresholdAlarmService overThresholdAlarmService; @Autowired PassengerFlowAnalysisService passengerFlowAnalysisService; private static final Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class); public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { try { String expiredKey = new String(message.getBody(), StandardCharsets.UTF_8); //发现关于账户锁定的key,那么删掉它 if (expiredKey.indexOf("callback_") != -1) { OverThresholdAlarm overThresholdAlarm = JSON.parseObject(redisService.get(expiredKey+"_2")+"", OverThresholdAlarm.class); String uuid = UUID.randomUUID().toString().replace("-", ""); overThresholdAlarm.setId(uuid); overThresholdAlarmService.insert(overThresholdAlarm); sendMessage(overThresholdAlarm); logger.info("redis key:"+expiredKey+"超时,事件已生成!!事件ID:"+uuid); //删除key stringRedisTemplate.delete(expiredKey); stringRedisTemplate.delete(expiredKey+"_2"); } super.onMessage(message, pattern); } catch (Exception e) { logger.error("监听超时redis key时,删除账户锁定key发生了错误!!!", e); } } void sendMessage(OverThresholdAlarm overThresholdAlarm){ //告警列表websocket 推送 JSONObject websocketJson = new JSONObject(); websocketJson.put("equipmentId",overThresholdAlarm.getEquipmentId()); websocketJson.put("id",overThresholdAlarm.getId()); websocketJson.put("equipmentName",overThresholdAlarm.getEquipmentName()); websocketJson.put("desc","人员排队告警"); websocketJson.put("alarmTime", DateUtils.printJdkDate(new DateTime(),DateUtils.PATTERN_OF_DATE_TIME_EN)); websocketJson.put("currentPersonsNumber", overThresholdAlarm.getCurrentPersonsNumber()); websocketJson.put("deptId", overThresholdAlarm.getBelongDeptId()); passengerFlowAnalysisService.calculationNowLineupNumberNew(websocketJson); } }