2016-05-17 3 views
0

ここでは、RabbitMQキューをリッスンするWebアプリケーションがあります。すべて正常に動作しますが、キュー(127.0.0.1)のホストアドレスがspring xml configにハードコードされていることは許されません。実行時にspring-rabbitキューアドレスを変更可能に設定する

ホストを外部レジストリから即座に設定するにはどうすればよいですか?

ホストのアドレスは、アプリの使用期間中に変更されることがあります。私は春に必要なたびにキューアドレスのカスタム書込みメソッドを尋ねたほうがよいでしょう。

<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 EAP 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(); 
関連する問題