Redis对PUBSUB有很好的实现,在一个通道上发布的消息会被为该主题注册的多个接收者接收。
什么是实现点对点(即队列)语义的理想方式,例如,多个接收者注册在一个队列中,一旦消息被推送到队列中,它将被只有一个接收者(监听器)处理?任何Java参考例子都会有帮助。
这里的想法是读取一个包含事务记录的巨大文件,因此每个事务应该只被处理一次。
我可以看到Redis Streams是建议的,但我没有看到一个完善的Java参考实现。
只要使用 LPUSH msgqueue
把项目放在列表中,让所有的客户端都这样做。
while running
BRPOP msgqueue
# process popped item
done
请注意,没有像PUBSUB主题那样直接实现。在这里使用队列的另一个原因是,在Publish Subscribve中没有Durable Subscription,也就是说,当订阅者在发送消息的时候没有起床,你的消息就会丢失,但下面的队列实现可以节省一点时间。最终答案
LPUSH TEST_QUEUE 测试信息LLEN TEST_QUEUEBRPOP TEST_QUEUE 0
Java实现
while(true){
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
int keySize =this.pushOperation.size("TEST_QUEUE");
//iterate keySize {
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
}
}