将spring-rabbit队列地址配置为可在运行时更改



这是一个监听RabbitMQ队列的web应用程序。一切都很好,但队列的主机地址(127.0.0.1)是在spring-xml配置中硬编码的,这是不可接受的。

如何从外部注册表动态配置主机?

主机地址可能在应用程序使用期间发生更改。我更希望spring在每次需要时都为队列地址询问一些自定义编写的方法。

<rabbit:queue id="myQueue" />
<rabbit:topic-exchange id="myExchange" name="my-exchange">
    <rabbit:bindings>
        <rabbit:binding queue="myQueue" pattern="my.#.*">
        </rabbit:binding>
    </rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:connection-factory id="connectionFactory" host="127.0.0.1" username="test" password="test" />
<bean id="queListener" class="my.QueListener" />
<rabbit:listener-container id="myListenerContainer" connection-factory="connectionFactory">
    <rabbit:listener ref="queListener" queues="myQueue" />
</rabbit:listener-container>

弹簧4.1,春季jms,春兔:1.5,jboss 6.4 eap

这是我的解决方案。也许它有一些问题,但基本上它是有效的。

private SimpleMessageListenerContainer container;
private static CachingConnectionFactory connectionFactory;
// 1. stop existing consumer
if (container != null) {
    container.stop();
}
if (connectionFactory != null) {
   connectionFactory.destroy();
}
// 2. re-create consumer from scratch
//    imagine all string constants comes from a config
CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
connectionFactory = cf;
cf.setUsername("tst");
cf.setPassword("tst");
RabbitAdmin admin = new RabbitAdmin(cf);
Queue queue = new Queue("myQueue");
admin.declareQueue(queue);
TopicExchange exchange = new TopicExchange("myExchange");
admin.declareExchange(exchange);
admin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(routingKey));
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
Object listener = new Object() {
    public void handleMessage(byte[] message) { ... }
};
MessageListenerAdapter adapter = new MessageListenerAdapter(listener);
container.setMessageListener(adapter);
container.setQueueNames(queueName);
container.start();

最新更新