Redis stream 做为新的轻量级的框架,已经在小型业务里面大量使用,但是最近发现,redis 重启后,新来的 消息无法消费,进一步排查发现,由于StreamMessageListenerContainer 被暂停导致的,先上导致问题原因 的源码:
StreamPollTask 类 拉取redis 消息 loop task
图中 如果异常断言为true ,则 会走 cancel(),其实就是更改 state ,导致loop 退出
而默认的 如果你直接使用 listenerContainer.receive(Consumer.from(group, consumer), StreamOffset.create(stream, ReadOffset.lastConsumed()), streamListener);
异常处理是 true
知道了原因了 解决问题就很简答了 ,分析得知 cancelSubscriptionOnError 可以通过 StreamMessageListenerContainer.StreamReadRequest 进行配置, 而 listenerContainer.receive 只会使用默认的 StreamReadRequest ,进入到 listenerContainer 里面会发现 还有一个 register 方法 (实际上 receive 也是调用了 register ),可以配置 StreamReadRequest
所以最后变成