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で表示できます。