Spring AMQP:使用程序化端点注册时,如何设置路由密钥?

时间:2016-03-15 15:55:00

标签: spring spring-amqp

我正在使用侦听器端点的程序化端点注册:

MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint();
endpoint.setId(endpointId);
endpoint.setQueues(eventsQueue);
endpoint.setBean(hanlderMethod.bean);
endpoint.setMethod(hanlderMethod.method);
endpoint.setMessageHandlerMethodFactory(messageHandlerMethodFactory);
registrar.registerEndpoint(endpoint);

我的问题是,如何确定此端点的路由密钥?

编辑:为了进一步说明,我使用单个队列来处理不同类型的消息,我想根据路由键将它们路由到不同的方法。这是用于将消息路由到此队列的路由密钥的补充。

基本上,用例是通用事件总线。所有活动都进入同一个交易所。每种类型的事件都有一个唯一的路由键。每个服务都有一个事件队列。每个服务通过使用该事件类型的路由键在事件交换和它自己的事件队列之间添加适当的绑定来订阅它感兴趣的事件。每种事件类型都有不同的处理程序方法。

1 个答案:

答案 0 :(得分:1)

看,你说Listener,所以你要收听一些队列的消息。

是的,你通过setQueues()来做到这一点。

现在关于routingKey

  

路由键是一个消息属性。在决定如何将消息路由到队列时(取决于交换类型),交换机可能会查看此密钥。

所以,它确实与Listener没有关系。

虽然我同意在处理队列时我们应该在那个地方准确地声明Binding。因此在听众部分。

因此,如果您手动进行MethodRabbitListenerEndpoint注册(绕过@RabbitListener定义),您也应手动声明并注册Binding。已经在适当的routingKeyhttp://docs.spring.io/spring-amqp/reference/html/_reference.html#_binding

<强>更新

您正在寻找没有这样的内置功能。 我们有MultiMethodRabbitListenerEndpoint根据有效负载类型进行路由,但没有任何其他可能的过滤器。

可以使用Spring Integration路由器实现您的目标,该路由器可以根据AmqpHeaders.RECEIVED_ROUTING_KEY标头做出决定。

从另一方面来看,最好为每个routing key注册唯一的队列,并且只有一个可能的侦听器用于适当的方法。