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