[英]Spring data Redis Pub/Sub and Websockets: recieving messages
[英]Redis Pub/Sub with Spring Data Redis: Messages arrive in wrong order
我正在嘗試使用Spring Data Redis的Redis發布/訂閱來實現聊天。
我使用RedisTemplate發布消息,如下所示:
public class RedisPublisher {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void publish(ChannelTopic channelTopic, Object channelMessage) {
redisTemplate.convertAndSend(channelTopic.getTopic(), channelMessage);
}
}
為了接收消息,我有一個MessageListener,如下所示:
public class RedisConsumer implements MessageListener {
MessageSerializer serializer = new MessageSerializer();
AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public void onMessage(Message message, byte[] pattern) {
Object obj = serializer.deserialize(message.getBody());
if(obj != null && obj instanceof RedisMessage) {
System.err.println("Received message(" + atomicInteger.incrementAndGet() + ") " + obj.toString());
}
}
消息的發布方式如下:
final ChannelTopic channelTopic=connectionManager.subscribe("topic");
new Thread(new Runnable() {
public void run() {
Thread.sleep(5000);
for (int i = 0; i < 10; i++) {
redisPublisher.publish(channelTopic, new RedisMessage(i + 1));
}
}
}).run();
但是,收到的消息似乎傳遞順序錯誤:
Received message(1) message id: 3
Received message(2) message id: 2
Received message(3) message id: 1
Received message(4) message id: 4
Received message(5) message id: 5
Received message(6) message id: 6
Received message(7) message id: 7
Received message(8) message id: 8
Received message(9) message id: 9
Received message(10) message id: 10
是否可以使用Spring提供的RedisTemplate / MessageListener同步發送/接收消息?
當前的代碼庫很小,可以在GitHub上查看。
Redis的PubSub的是眾所周知的,為了傳遞消息(至少保證,如果你使用一個連接,並觸發PUBLISH
該PUBLISH
命令返回了通知客戶端的數量)。 默認情況下,導致亂序的原因是Spring Data Redis調度消息的方式。 通知是在不同的線程上處理的,這就是原因。 感謝您的代碼,它幫助我快速重現了行為。
我可以想到兩種解決此問題的策略:
但是,您可以在RedisMessageListenerContainer
提供執行該命令的執行RedisMessageListenerContainer
。 現在,我正在考慮的任何形式的同步都會損害性能。
在BinaryJedisPubSub
之上實現自己的消息偵聽BinaryJedisPubSub
。 您可以控制消息,並且可以省略執行程序問題。
HTH,馬克
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.