2017-10-25 9 views
1

私はウサギの送信者と受信者を持つ簡単なスプリングブートアプリケーションを持っています。私は、受信者が同じメッセージを受信したかどうかを確認するために、受信者テストを書いて、Junitクラスルール(RabbitContainerRule)としてrabbitmq dockerインスタンスを実行してから、rabbitTemplateを使用してメッセージを送信します。しかし、私は次の例外取得しています:私は、管理コンソールを使用してドッキングウィンドウインスタンスに(ブレークポイントで停止することによって)手動でキューを作成した場合bean 'org.springframework.amqp.rabbit.config.internalRabbitListenerEndpointRegistry'を開始できませんでした。

Caused by: org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.amqp.rabbit.config.internalRabbitListenerEndpointRegistry'; nested exception is org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup 
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) 

Caused by: org.springframework.amqp.rabbit.listener.QueuesNotAvailableException: Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it. 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:599) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1424) 

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'my-message-queue' in vhost '/', class-id=50, method-id=10) 
    at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) 

を、私のテストは合格します。

また、ドッカーのウサギインスタンスを使用して手動でテストすると、私のスプリングブートアプリケーションが正常にキューを作成します。だから、それはテストで作成しない原因になっている?

私は春、AMQP 1.7.4 RELEASEを使用しています

レシーバーコード:

また、私はコンフィギュレーションで 私のメッセージキューのための任意の@Beanを作成し、依存しているわけではない
@RabbitListener(bindings = @QueueBinding(
     value = @Queue(value = "my-message-queue", durable = "true", 
       arguments = { 
         @Argument(name = "x-dead-letter-exchange", value = "my-message-exchange-dead-letter"), 
         @Argument(name = "x-dead-letter-routing-key", value = "my-message-queue")}), 
     exchange = @Exchange(value = "my-message-exchange", type = "topic", durable = "true"), 
     key = "my-message-rk") 
) 
public void handleMessage(MyMessage message) { 
    MESSAGE_LOG.info("Receiving message: " + message); 
} 

@RabbitListenerに私のためのものを作成してください。しかし、私は自分の設定でConnectionFactory、RabbitTemplate、SimpleRabbitListenerContainerFactory Beanを作成しています。

+0

あなたは 'RabbitAdmin' Beanを持っていますか? –

+0

GitHubのどこかでアプリケーション全体を共有するのはどうですか? –

+0

ありがとうArtem。テスト設定でRabbitAdmin Beanを追加すると、この問題が解決されました。また、設定ファイルに@EnableRabbitがありませんでした。 – agill

答えて

1

クラスでは、アプリケーションコンテキストが@RabbitListenerを解析できるようにするために、@EnableRabbitが必要です。

アプリケーションにキューと交換とバインドを自動的に作成させ、コンフィグレーションにRabbitAdminのBeanが存在する必要があります。

は、より多くの情報のためのリファレンス・マニュアルを参照してください:https://docs.spring.io/spring-amqp/docs/2.0.0.RELEASE/reference/html/

関連する問題