我正在尝试使用@RabbitListener侦听来自从属性加载的不同主机的多个队列。队列是相同的,并且需要相同的消息处理。
我设法做到了“静态”
通过这样声明我的工厂:
@Bean
public ConnectionFactory defaultConnectionFactory() {
CachingConnectionFactory cf = new CachingConnectionFactory();
cf.setAddresses(hosts);
cf.setPort(port);
cf.setUsername(username);
cf.setPassword(password);
cf.setConnectionLimit(10000);
cf.getRabbitConnectionFactory().setConnectionTimeout(connectionTimeout);
return cf;
}
@Bean
public SimpleRabbitListenerContainerFactory connectionFactory2() {
SimpleRabbitListenerContainerFactory sf = new SimpleRabbitListenerContainerFactory();
CachingConnectionFactory cf = new CachingConnectionFactory();
cf.setAddresses(host2);
cf.setPort(port2);
cf.setUsername(username2);
cf.setPassword(password2);
cf.setConnectionLimit(connectionLimit);
cf.getRabbitConnectionFactory().setConnectionTimeout(connectionTimeout);
sf.setConnectionFactory(cf);
return sf;
}
然后像这样将@RabbitListener注释添加到我的侦听器类中:
@RabbitListener (queues = "q1")
@RabbitListener (queues = "q2" , containerFactory = "connectionFactory2")
public class RabbitListener {
但是我希望能够在启动时通过加载一些属性列表(例如
rabbit.host[i]
)然后将其动态添加到我的监听器中来创建连接工厂。这样的事情可能吗?此用例的最佳实践是什么?
最佳答案
您不能使用静态@RabbitListener
注释来做到这一点,但是可以register listener endpoints programmatically。
您可以使用此处所示的SimpleRabbitListenerEndpoint
,如果要调用POJO方法(如MethodRabbitListenerEndpoint
,则可以使用@RabbitListener
)。
您可以使用重载的registerEndpoint
方法连接适当的工厂。