SpringDataRedis Stream 监听框架在Reids 重启的情况下,监听失效问题解决

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

所以最后变成

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot Redis Stream 中,可以使用 Redis Stream API 的 `XREADGROUP` 命令来进行批量消费。以下是一些示例代码: ```java @Component public class MyStreamConsumer { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private MyStreamMessageListener messageListener; @PostConstruct public void init() { StreamMessageListenerContainer.Options options = StreamMessageListenerContainer .Options.builder() .batchSize(10) .targetType(String.class) .build(); StreamMessageListenerContainer<String, Object> container = StreamMessageListenerContainer .create(redisTemplate.getConnectionFactory(), options); StreamOffset<String> offset = StreamOffset.create("mystream", ReadOffset.lastConsumed()); container.receive( Consumer.from("mygroup", "myconsumer"), offset, messageListener); container.start(); } } @Component public class MyStreamMessageListener implements StreamMessageListener<String, Object> { @Override public void onMessage(StreamMessage<String, Object> message) { // 处理消息 } } ``` 在上面的代码中,`MyStreamConsumer` 类负责创建并启动一个 `StreamMessageListenerContainer`,并将其连接到 Redis Stream 中。`MyStreamMessageListener` 类实现了 `StreamMessageListener` 接口,用于处理消费者接收到的消息。 在 `MyStreamConsumer` 类的 `init` 方法中,我们使用了 `StreamMessageListenerContainer.Options` 类来设置批量消费的选项,包括批量大小和目标类型。我们还创建了一个 `StreamOffset` 对象,在消费者组的上下文中指定了读取的偏移量。 然后,我们将 `StreamMessageListenerContainer` 的 `receive` 方法用于创建一个消息接收器,并指定消费者组、偏移量和消息监听器。最后,我们启动了容器。 当消息到达 Redis Stream 时,它们将被分发给 `MyStreamMessageListener` 的 `onMessage` 方法进行处理。在这个方法中,我们可以对接收到的消息进行处理,例如打印它们的内容或将它们写入其他系统。这个方法将在批量中一次接收多个消息,可以在处理消息时一次性处理多个消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值