2016-05-17 3 views
0

Вот веб-приложение, слушающее очередь RabbitMQ. Все работает нормально, но неприемлемо, что адрес хоста (127.0.0.1) жестко запрограммирован в Spring xml config.Настройка адреса очереди весенне-кроликов для изменения во время выполнения

Как я могу настроить хост на лету, из внешнего реестра?

Адрес хоста может измениться во время жизни приложения. Я бы предпочел, чтобы весна задавала какой-то пользовательский письменный метод для адреса очереди каждый раз, когда это необходимо.

<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> 

Spring 4.1, весна-JMS, весна-кролик: 1,5, JBoss 6,4 еар

ответ

0

Вот мое решение. Вероятно, у него есть некоторые проблемы, но в основном это работает.

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(); 
Смежные вопросы