繁体   English   中英

redis spring 数据中是否支持 XClaim / 声明 - ReactiveRedisOperations.opsForStream()

[英]Is XClaim / claim supported in redis spring data - ReactiveRedisOperations.opsForStream()

为了使用 redis 流构建可靠的消息队列,我正在使用 spring-boot-starter-data-redis-reactive 和 lettuce 依赖项来处理来自 redis ZF7B44CFAFD5C52223E7B8 的消息。 虽然我能够通过ReactiveRedisOperations.opsForStream()以消费者组的形式添加、读取、确认和删除消息,但我找不到 api 以声明未确认的待处理消息 5 分钟在this.reactiveRedisConnectionFactory.getReactiveConnection().streamCommands().xClaim()下可用。 但我不想使用样板代码来管理异常、序列化等。有没有办法使用ReactiveRedisOperations.opsForStream()声明消息

https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ReactiveStreamOperations.ZFC35FDC70D5FC69D269883A8E3E

如果没有 spring 数据 redis,直接使用生菜客户端库,我可以获得待处理的消息并声明如下消息

public Flux<PendingMessage> getPendingMessages(PollMessage pollMessage, String queueName) {
    Predicate<PendingMessage> poisonMessage = pendingMessage -> (pendingMessage.getTotalDeliveryCount()<=maxRetries);
    Predicate<PendingMessage> nackMessage = pendingMessage -> (pendingMessage.getElapsedTimeSinceLastDelivery().compareTo(Duration.ofMillis(ackTimeout)) > 0 );

    return statefulRedisClusterConnection.reactive()
        .xpending(queueName, pollMessage.getConsumerGroupName(), Range.unbounded(), Limit.from(1000))
        .collectList()
        .map((it) -> ((PendingMessages)PENDING_MESSAGES_CONVERTER
                .apply(it, pollMessage.getConsumerGroupName()))
                .withinRange(org.springframework.data.domain.Range.unbounded()))
            .flatMapMany(Flux::fromIterable)
            .filter(nackMessage)
            .filter(poisonMessage)
            .limitRequest(pollMessage.getBatchSize());
}

为了声明消息,我再次使用了生菜库中的 api

public Flux<StreamMessage<String, String>> claimMessage(PendingMessage pendingMessage, String queueName, String groupName, String serviceName) {
    return statefulRedisClusterConnection.reactive()
            .xclaim(queueName, Consumer.from(groupName, serviceName), 0, pendingMessage.getIdAsString());
}

目前,从 redis 到 spring-data 获取待处理消息存在问题,因此我直接使用生菜库来获取待处理消息并声明它。

https://jira.spring.io/browse/DATAREDIS-1160

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM