feat()故障事件,监听redsi过期key

dev
20300 2024-06-21 11:33:38 +08:00
parent 04fbe0741a
commit 35244222f0
3 changed files with 130 additions and 0 deletions

View File

@ -0,0 +1,40 @@
package com.hyc.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
/**
*
*
* @author YouChe·He
* @ClassName: FaultMessage
* @Description:
* @CreateTime: 2024/6/20 15:30
*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class FaultMessage {
/**
* VIN
*/
private String vin;
/**
*
*/
private String faultCode;
/**
*
*/
private Date occurrenceTime;
/**
*
*/
private String actionType;
}

View File

@ -0,0 +1,45 @@
package com.hyc.kafka.demo.listener;
import com.alibaba.fastjson.JSONObject;
import com.hyc.config.RabbitmqConfig;
import com.hyc.domain.FaultMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* key
*
* @author YouChe·He
* @ClassName: KeyExpiredListener
* @Description: key
* @CreateTime: 2024/6/20 21:59
*/
@Slf4j
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
private RabbitTemplate rabbitTemplate;
public KeyExpiredListener(RedisMessageListenerContainer listenerContainer,RabbitTemplate rabbitTemplate) {
super(listenerContainer);
this.rabbitTemplate = rabbitTemplate;
}
@Override
public void onMessage(Message message, byte[] pattern) {
String expireKey = message.toString();
log.info("过期的key" + expireKey);
//在这里做过期key的处理
if (expireKey.startsWith("car_")){
String[] split = expireKey.split("_");
FaultMessage faultMessage = new FaultMessage(split[1], split[2], new Date(), "update");
rabbitTemplate.convertAndSend(RabbitmqConfig.FAULT_EXCHANGE,RabbitmqConfig.FAULT_MESSAGE_ROUTINGKEY, JSONObject.toJSONString(faultMessage));
}
}
}

View File

@ -0,0 +1,45 @@
package com.hyc.util;
import com.alibaba.fastjson.JSONObject;
import com.hyc.config.RabbitmqConfig;
import com.hyc.domain.FaultMessage;
import com.hyc.domain.VehicleData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
*
*
* @author YouChe·He
* @ClassName: EventHandleUtil
* @Description:
* @CreateTime: 2024/6/20 15:55
*/
@Slf4j
public class EventHandleUtil {
public static void insertToCache(CacheManager cacheManager, RedisTemplate<String,String> redisTemplate, VehicleData vehicleData, String keySuffix, RabbitTemplate rabbitTemplate){
Cache faultMessageCache = cacheManager.getCache("faultMessage");
Cache.ValueWrapper valueWrapper = faultMessageCache.get("car_"+vehicleData.getVin() + "_"+keySuffix);
if (valueWrapper == null){
FaultMessage faultMessage = new FaultMessage("car_"+vehicleData.getVin(), keySuffix, new Date(), "insert");
//发送故障开始消息
log.error("发送故障消息!!!");
rabbitTemplate.convertAndSend(RabbitmqConfig.FAULT_EXCHANGE,RabbitmqConfig.FAULT_MESSAGE_ROUTINGKEY,JSONObject.toJSONString(faultMessage));
rabbitTemplate.convertAndSend(RabbitmqConfig.FAULT_EXCHANGE,RabbitmqConfig.FAULT_MESSAGE_QUEUE,JSONObject.toJSONString(faultMessage));
faultMessageCache.put("car_"+vehicleData.getVin() + "_" + keySuffix, JSONObject.toJSONString(vehicleData));
redisTemplate.opsForValue().set("car_"+vehicleData.getVin()+"_"+keySuffix,JSONObject.toJSONString(vehicleData),10, TimeUnit.SECONDS);
}else {
log.warn("已经存在{}故障",keySuffix);
//已经存在此故障,继续添加 再次添加应该会更新缓存时间
faultMessageCache.put("car_"+vehicleData.getVin() + "_" + keySuffix, JSONObject.toJSONString(vehicleData));
//同时添加到redis,设置过期时间为10S
redisTemplate.opsForValue().set("car_"+vehicleData.getVin()+"_"+keySuffix,JSONObject.toJSONString(vehicleData),10, TimeUnit.SECONDS);
}
}
}