在springboot項目里使用redis做隊列的,教程網上很多不贅述了,使用過程中會遇到短時間不操作(五分鐘左右),redis連接就斷開了,再使用redis時會報連接超時,此次操作會失敗,然后幾秒內會重連,重新連上之后又可以正常往redis寫東西了,但是注冊的監聽器失效了,也就是說往隊列寫的消息無法消費了
監聽器的配置:
@Configuration
public class SubscriberConfig {
/**
* 創建連接工廠
*
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("actionQueue"));
return container;
}
@Autowired
Receiver receiver;
/**
* 綁定消息監聽者和接收監聽的方法
*
* @return
*/
@Bean
public MessageListenerAdapter listenerAdapter() {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
}
在網上找redis的重連或者心跳機制沒有太多信息
通過spring schedual自己寫個定時器,10秒執行一次,手動心跳,解決了問題
@Scheduled(cron = "0/10 * * * * *")
public void timer() {
redisTemplate.opsForValue().get("heartbeat");
}
kafkastream -》redis推數據,-》spring boot中訂閱數據后=》websocket推到前端
@Configuration
@EnableCaching
public class RedisConfig {
public static StringRedisTemplate stringRedisTemplate;
/**
* redis消息監聽器容器
* 可以添加多個監聽不同話題的redis監聽器,只需要把消息監聽器和相應的消息訂閱處理器綁定,該消息監聽器
* 通過反射技術調用消息訂閱處理器的相關方法進行一些業務處理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
//相當于xml中的bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//訂閱了一個叫chat 的通道
container.addMessageListener(listenerAdapter, new PatternTopic("vin_*"));
//這個container 可以添加多個 messageListener
return container;
}
/**
* 消息監聽器適配器,綁定消息處理器,利用反射技術調用消息處理器的業務方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
//這個地方 是給messageListenerAdapter 傳入一個消息接受的處理器,利用反射的方法調用“receiveMessage”
//也有好幾個重載方法,這邊默認調用處理器的方法 叫handleMessage 可以自己到源碼里面看
return new MessageListenerAdapter(receiver, "receiveMessage");
}
/**redis 讀取內容的template */
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
stringRedisTemplate=new StringRedisTemplate(connectionFactory);
return stringRedisTemplate;
}
/*定時心跳*/
@Scheduled(cron = "0/10 * * * * *")
public void timer() {
stringRedisTemplate.opsForValue().get("heartbeat");
}
}
@Component
public class MessageReceiver {
static final Logger log = LoggerFactory.getLogger(MessageReceiver.class);
/**接收消息的方法*/
public void receiveMessage(String message){
transformMsg(message);
}
public void transformMsg(String record){
try{
JSONObject msg = JSON.parseObject(record);
String vin = msg.getString("vid");
if (WebSocketServerSubLogin.getVinSet().contains(vin)) {
WebSocketServerSubLogin.sendInfo(record, vin);
}
}catch (Exception e){
log.error("",e.getMessage());
}
}
}