Spring cloud stream rabbitmq指定消费者

时间:2016-09-13 18:59:53

标签: spring-cloud-stream

我尝试发送包含不同主题的邮件,然后根据要收听的主题配置消费者。

我的想法是使用单个目的地" domainMessage"并使用自定义分区策略。我有一个枚举,我只是将该值用作partitionKey,而partitionStrategy将只返回密钥(假设密钥总是等于生产者端的分区计数)。

这会有用吗?如果是这样,我不确定如何配置消费者。

我的制作人有以下application.properties

spring.cloud.stream.bindings.output.destination=domainMessages
spring.cloud.stream.bindings.output.producer.partition-key-extractor-class=publisher.partitionstrategy.PartitionKeyExtractorImpl
spring.cloud.stream.bindings.output.producer.partition-selector-class=publisher.partitionstrategy.PartitionSelectorStrategyImpl
spring.cloud.stream.bindings.output.producer.partition-count=3

我的PartitionKeyExtractorImpl看起来像

@Override
    public Object extractKey(Message<?> message) {
        DomainMessage payload = (DomainMessage) message.getPayload();
        return payload.getType();
    }

我的PartitionStrategyImpl看起来像

@Override
    public int selectPartition(Object key, int partitionCount) {
        return (int)key;
    }

我的Consumer application.properties看起来像

spring.cloud.stream.bindings.input.destination=domainMessage
spring.cloud.stream.bindings.input.group=group01
spring.cloud.stream.bindings.input.consumer.partitioned=true
spring.cloud.stream.rabbit.bindings.input.consumer.durable-subscription=true

让我们说payload.getType()可以返回1-3之间的值。如何将使用者配置为仅侦听partitionKey为1和3的消息?

1 个答案:

答案 0 :(得分:0)

Spring云流对于声明队列和交换非常自以为是。

spring.cloud.stream.bindings.input.destination=domainMessage
spring.cloud.stream.bindings.input.group=group01
spring.cloud.stream.bindings.input.consumer.partitioned=true
spring.cloud.stream.rabbit.bindings.input.consumer.durable-subscription=true
spring.cloud.stream.bindings.input.consumer.instance-index=0

(注意实例索引)

这会将domainMessage.group01-0绑定到与路由密钥domainMessage交换domainMessage-0

如果您希望在单个实例中使用多个分区,只需执行

即可
spring.cloud.stream.bindings.input.destination=domainMessage-0,domainMessage-1

(并删除instance-indexpartitioned=true)无法正常工作,因为它会将每个队列绑定到相应的交换机(例如domainMessage-0与路由键# )。

一种解决方案是执行此操作,但手动添加交换到交换绑定以使用适当的路由密钥将每个使用者交换(domainMessage-n)绑定到上游交换(domainMessage)。 / p>

目前无法在单个instance-index中自动使用多个分区。