【问题标题】:How to subscribe to a specific routing key using RabbitMQ如何使用 RabbitMQ 订阅特定的路由密钥
【发布时间】:2018-09-08 14:22:07
【问题描述】:

我们正在设计一个微服务架构,我们想使用 RabbitMQ 作为消息代理。

我们希望每个服务都有一个特定的队列,比如说applicationQueue

我们还定义了我们的消息有两种:

事件:路由到每个服务的消息。如果服务对某个特定事件感兴趣,它将拦截它并从中创建一个任务

任务:代表从服务创建的作业给他自己的消息,它们应该只发布到服务本身的队列中

到目前为止,我们正在努力使用 Spring AMQP 来实现这一点。

我们设计了一个消息生产者,所以在一个给定的 http 请求之后,它会为服务本身创建一个任务:

休息控制器:

@PostMapping
public void saveProduct(@RequestBody Product product) {
    messageProducer.message("subscriptions.product.create", product)
            .fromHttpRequest(requestContext)
            .send();
}

我们的消息生产者的发送方法:

public void send() {
        template.convertAndSend(exchange, routingKey, payload, message -> {
            if (requestContext != null) {
                extractHttpRequestInfo(message);
                message.getMessageProperties().getHeaders()
                        .put(MessageDictionary.TRANSACTION_ID, generateTransactionId());
            } else if (originalMessage != null) {
                extractMessageInfo(message);
            }
            return message;
        });
    }

RabbitMQ 配置:

@Bean
List<Binding> binding(Queue queue, TopicExchange exchange) {
    return Arrays.asList(
            BindingBuilder.bind(queue).to(exchange).with("*.*"),
            BindingBuilder.bind(queue).to(exchange).with("${condohub.rabbitmq.queue.name}.#")
    );
}

然后在别处订阅(@Digest注解是自定义注解):

@Digest("${condohub.rabbitmq.queue.name}.product.create")
public void createProduct(Product product) {
    service.save(product);
}

欢迎任何帮助。

【问题讨论】:

  • 我不清楚你的问题到底是什么?如何使用 RabbitMQ 订阅特定的路由密钥?

标签: spring rabbitmq microservices spring-amqp


【解决方案1】:

您的绑定没有意义;第一个将匹配所有具有foo.barbaz.qux 等形式的键,因此第二个无关紧要。

您可能应该只对事件使用扇出交换,并且每个服务有 2 个队列,一个用于事件的扇出,一个用于作业的主题交换(仅针对其自己的作业具有窄绑定)。

【讨论】:

  • 我相信我在这里误解了概念。你可能是对的!
  • 与 JMS 不同,您不能“选择”队列中的消息;无论您如何绑定它们,您都需要 2 个队列。
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2013-03-07
  • 2017-07-25
  • 2017-04-07
  • 1970-01-01
  • 2015-09-30
  • 2021-11-07
相关资源
最近更新 更多