Java Spring数据redis RedisMessageListenerContainer似乎有竞争条件
Java Spring数据redis RedisMessageListenerContainer似乎有竞争条件,java,multithreading,spring-data-redis,Java,Multithreading,Spring Data Redis,lazyListen()方法将listening标志设置为true,然后启动一个线程来运行SubscriptionTask。调用addMessageListener(),然后使用相同的JedisConnection订阅更多主题。但是SubscriptionTask启动进程没有保护,对addMessageListener()的调用可能在该进程完成之前到达,因此订阅可能会完全丢失,或者两个线程可能同时写入同一输出流,因此Redis会被发送一个损坏的命令 在取消订阅所有主题后关闭任务时,也会出现类似问
lazyListen()
方法将listening
标志设置为true,然后启动一个线程来运行SubscriptionTask。调用addMessageListener()
,然后使用相同的JedisConnection订阅更多主题。但是SubscriptionTask启动进程没有保护,对addMessageListener()
的调用可能在该进程完成之前到达,因此订阅可能会完全丢失,或者两个线程可能同时写入同一输出流,因此Redis会被发送一个损坏的命令
在取消订阅所有主题后关闭任务时,也会出现类似问题。在将新的subscribe命令返回池之前,可以在连接上发送该命令。如果该连接随后用于非订阅命令,则会发生错误
通过订阅主题并等待订阅任务完全建立后再允许进一步连接,并且永远不要取消订阅,可以缓解此问题。但即使如此,如果由于引发异常而关闭任务,则仍可能发生此情况,因此下次订阅主题时将创建一个新的SubscriptionTask。是否介意在中打开一个问题。最好提供一些代码来重新介绍您所面临的问题。谢谢啊,我以前没发现。提交的DATAREDIS-389:已经看到了这个-我们会检查-感谢测试用例!