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