Spring 如何使用RabbitMQ订阅特定路由密钥

Spring 如何使用RabbitMQ订阅特定路由密钥,spring,rabbitmq,microservices,spring-amqp,Spring,Rabbitmq,Microservices,Spring Amqp,我们正在设计一个微服务体系结构,我们希望使用RabbitMQ作为消息代理 我们希望每个服务都有一个特定的队列,比如说applicationQueue 我们还将我们的消息定义为两种: 事件:路由到每个服务的消息。如果服务对某个特定事件感兴趣,它将拦截该事件并从中创建任务 任务:表示从服务创建的作业的消息应发布到服务本身的队列中 到目前为止,我们正在努力使用SpringAMQP实现这一点 我们设计了一个消息生成器,因此在给定http请求之后,它将为服务本身创建一个任务: RestController

我们正在设计一个微服务体系结构,我们希望使用RabbitMQ作为消息代理

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

我们还将我们的消息定义为两种:

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

任务:表示从服务创建的作业的消息应发布到服务本身的队列中

到目前为止,我们正在努力使用SpringAMQP实现这一点

我们设计了一个消息生成器,因此在给定http请求之后,它将为服务本身创建一个任务:

RestController:

@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}.#")
    );
}

欢迎任何帮助。

您的绑定没有意义;第一个将把所有键与表单
foo.bar
baz.qux
等匹配,因此第二个键是不相关的


您可能只需要使用扇出交换来处理事件,每个服务都有两个队列,一个在扇出上处理事件,另一个在主题交换上处理作业(只有自己的作业有一个狭窄的绑定)。

我不清楚您的问题到底是什么?如何使用RabbitMQ订阅特定的路由密钥?我相信我误解了这里的概念。你可能是对的!与JMS不同,您不能在队列中“选择”消息;无论如何绑定,都需要2个队列。
@Digest("${condohub.rabbitmq.queue.name}.product.create")
public void createProduct(Product product) {
    service.save(product);
}