2017-11-01 9 views
1

RabbitListenerアノテーションを使用してキューを複数のエクスチェンジにバインドできるようになっていますが、これまでに失敗しています。RabbitListenerバインディングキューと複数のエクスチェンジ

私が今持っていることは次のとおりです。

@RabbitListener(bindings = @QueueBinding(value = 
    @Queue(
     value = "${subscriber.queueInbound}", durable = "true", autoDelete = "false", exclusive = "false"), 
     exchange = @Exchange(value = "all", durable = "true") 
    ), 
    containerFactory = "subscriberRabbitListenerContainerFactory" 
) 
public void onMessage(Message message, Channel channel) { 
    // do something 
} 

これは、スタート/再接続、自動でsubscriber.queueInboundとして定義されたキューを作成し、デフォルトall交流にこのキューをバインドします。

私はジョブをバックグラウンドで実行して、このキューを適切に構成し、それを構成する必要のある複数の交換にバインドします。

@RabbitListenerのいずれかを使ってこれを行うよりエレガントな方法を探しています。再接続すると、再接続する前にキューを適切に設定できるように調整する必要があります。

元々私はBeanを使ってキューの設定を行っていましたが、解決したRabbitMQが利用できない場合にアプリケーションの起動が妨げられましたが、起動してキュー設定のステップが実行されませんでした。もともと私は、豆を通じてキュー構成をしていた

答えて

0
@RabbitListener(bindings = { 
     @QueueBinding(value = 
      @Queue(value = "foo"), exchange = @Exchange("ex1"), key="foo"), 
     @QueueBinding(value = 
      @Queue(value = "foo"), exchange = @Exchange("ex2"), key="bar") 
}) 
public void listen(String in) { 

} 

のRabbitMQは利用できなかった場合は、アプリケーションのこの防止スタートアップは私が解決されたが、その後、それが起動し、キューの設定手順が実行されないことになります。

これは、コンテキストの初期化中に「不正」なことをしていることを意味します。コンテキストが完全に構築されるまで、RabbitMQと対話しないでください。

豆は、接続を最初に開いたときにブローカでのみ宣言されます。

+0

はい私はエラーを認識し、それを修正するために取り組んでいますが、設定ファイルからキューを構成している交換をより明確にする必要があるので、 '@ QueueBinding'を実行時まで設定します。 – Welsh

+0

それで、注釈ではできません。より単純な 'queues'プロパティはSpELを使って' String [] 'を返すことができます。 '#{'$ {some.prop}'。split( '、')}' @ QueueBinding'アノテーションはあまりにも複雑で、そのようなものを実装することはできません。 –

関連する問題