【发布时间】: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