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

Spring AMQP:使用编程端点注册时,如何设置路由密钥?,spring,spring-amqp,Spring,Spring Amqp,我正在使用侦听器端点的编程端点注册: MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint(); endpoint.setId(endpointId); endpoint.setQueues(eventsQueue); endpoint.setBean(hanlderMethod.bean); endpoint.setMethod(hanlderMethod.method); endpoint.setMe

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

MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint();
endpoint.setId(endpointId);
endpoint.setQueues(eventsQueue);
endpoint.setBean(hanlderMethod.bean);
endpoint.setMethod(hanlderMethod.method);
endpoint.setMessageHandlerMethodFactory(messageHandlerMethodFactory);
registrar.registerEndpoint(endpoint);
我的问题是,如何确定此端点的路由密钥


编辑:为了进一步澄清,我对不同类型的消息使用单个队列,我希望根据路由密钥将它们路由到不同的方法。这是对用于将消息路由到此队列的路由密钥的补充


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

看,你说的是
Listener
,所以你要监听一些队列中的消息

没错,您可以通过
setQueues()
来实现这一点

现在关于
routingKey

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

因此,它实际上与
侦听器
无关

尽管我同意在处理队列时,我们应该准确地在那个位置声明
Binding
。因此,在侦听器部分

因此,如果您手动注册
MethodRabbitListenerEndpoint
(绕过
@RabbitListener
定义),您也应该手动声明和注册
绑定
。这里已经有一个合适的
路由键

更新

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

您可以使用Spring集成路由器实现所需功能,该路由器可以根据
AmqpHeaders.RECEIVED\u ROUTING\u KEY
报头做出决定


从另一方面来说,可能最好为每个
路由键注册唯一的队列,并为该队列使用适当的方法只有一个可能的侦听器。

是的,我知道该声明,我也在这样做。问题是,我希望根据路由密钥将消息路由到同一队列中的不同方法。请参阅我的答案中的更新。我使用了多队列解决方案,但最好添加此功能,因为在这种常见情况下,它将最小化所需队列的数量。嗯,您甚至可以只实现常规的
侦听器
,并根据
MessageProperties.receivedRoutingKey
值从中进行路由。是的,使用通用的
侦听器
,您必须这样做。但是你仍然可以从反序列化中获得收益。您可以只使用一个
RabbitListener
方法,将
负载
@Header(AmqpHeaders.RECEIVED_ROUTING_KEY)
作为所需参数。在此处执行路由决策,并使用其参数调用适当的方法。我认为
消息
(或者仅仅是
有效负载
)将是目标方法的更好选择。