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);
    }

}

 

posted @ 2022-07-08 16:45  90的生力军  阅读(325)  评论(0编辑  收藏  举报