RabbitMQ 流插件的初始消费者支持

现在提供了对 RabbitMQ Stream 插件 的基本支持。要启用此功能,您必须将 spring-rabbit-stream jar 添加到类路径 - 它必须与 spring-amqpspring-rabbit 为同一版本。

当您将 containerType 属性设置为 stream 时,上面描述的消费者属性不受支持;concurrency 仅支持超级流。每个绑定只能消耗一个流队列。

要将绑定器配置为使用 containerType=stream,Spring Boot 将自动从应用程序属性中配置一个 Environment @Bean。您还可以选择添加一个定制器来定制监听器容器。

@Bean
ListenerContainerCustomizer<MessageListenerContainer> customizer() {
    return (cont, dest, group) -> {
        StreamListenerContainer container = (StreamListenerContainer) cont;
        container.setConsumerCustomizer((name, builder) -> {
            builder.offset(OffsetSpecification.first());
        });
        // ...
    };
}

传递给定制器的 name 参数为 destination + '.' + group + '.container'

name()(用于偏移量跟踪)设置为绑定 destination + '.' + group。它可以使用上面所示的 ConsumerCustomizer 进行更改。如果您决定使用手动偏移量跟踪,则 Context 可用作消息头

int count;

@Bean
public Consumer<Message<?>> input() {
    return msg -> {
        System.out.println(msg);
        if (++count % 1000 == 0) {
            Context context = msg.getHeaders().get("rabbitmq_streamContext", Context.class);
            context.consumer().store(context.offset());
        }
    };
}

有关配置环境和使用者构建器的详细信息,请参阅 RabbitMQ Stream Java 客户端文档

对 RabbitMQ 超级流的使用者支持

有关超级流的信息,请参阅 超级流

使用超级流允许在超级流的每个分区上使用单个活动使用者自动执行向上扩展和向下扩展。

配置示例

@Bean
public Consumer<Thing> input() {
    ...
}
spring.cloud.stream.bindings.input-in-0.destination=super
spring.cloud.stream.bindings.input-in-0.group=test
spring.cloud.stream.bindings.input-in-0.consumer.instance-count=3
spring.cloud.stream.bindings.input-in-0.consumer.concurrency=3
spring.cloud.stream.rabbit.bindings.input-in-0.consumer.container-type=STREAM
spring.cloud.stream.rabbit.bindings.input-in-0.consumer.super-stream=true

框架将创建一个名为 super 的超级流,其中包含 9 个分区。最多可以部署此应用程序的 3 个实例。