【发布时间】:2014-11-24 15:55:54
【问题描述】:
创建了一个基本的 spring-amqp 设置后,我看到对于我想要发送的每种类型的消息(使用消息 POJO),我需要在 spring 配置中声明队列。
所以对于每一对:
amqpTemplate.convertAndSend("queue1", new MessageType1(...));
@RabbitListener(queues = "queue1")
public void handleMessage(MessageType1 msg) {...}
我需要这样的 spring 配置条目:
<rabbit:queue name="queue1"/>
这对我来说似乎是多余的。如果我想到 HTTP url 之类的队列,那么使用 @RequestMapping("/some-url") 声明控制器就足够了,没有必要在配置的其他地方也声明 /some-url。
如果最终应用程序将有多种类型的消息通过代理,那只会使配置膨胀。
我看到了两种避免这种情况的方法:
-
自动为每个带注释的侦听器端点声明队列。即如果有一个带注释的侦听器端点
@RabbitListener(queues = "hello"),那么可以推断应该声明一个队列hello。我认为这可能已经是这种情况,但是当我从上下文配置中删除队列时,出现以下错误:WARN BlockingQueueConsumer - Failed to declare queue:hello WARN BlockingQueueConsumer - Queue declaration failed; retries left=2 org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[hello] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:479) at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:400) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1022) -
在同一个队列上使用不同的消息 POJO。因此,在
queue1上同时发送MessageType1和MessageType2,每个都根据有效负载类型到达不同的端点。实际上,这会创建一种单一的“应用程序队列”,类似于数据库模式:@RabbitListener(queues = "queue1") public void handleMessage1(MessageType1 msg) {...} @RabbitListener(queues = "queue1") public void handleMessage2(MessageType2 msg) {...}尝试这种方法产生了错误。
spring-amqp (1.4.0) 目前是否可以实现上述任何一项,如果可以,如何实现?
【问题讨论】:
-
你看过Remoting via AMQP吗?它使用您在 (2) 中暗示的机制。我不知道上下文,但这可能对你有用。
标签: java spring spring-amqp