2017-04-25 14 views
1

spring-amqpサンプルプロジェクトを取得して、rabbitmqのドッカーバージョンに対して実行しようとすると、私はちょうど標準のrabbitmqドッカーを実行しています。接続に問題はありませんが、キューを作成する際には常に例外が発生しますが、現時点で可能なすべてのバリアントを試しました。rabbitmq dockerでspring-bootからrabbitmqのキューを作成する方法

私は、サンプルプロジェクトのような構成でキューを宣言しようとしました。明示的にRabbitAdminを設定しようとしました。私は、自動設定された混乱を完全に設定しようとしました。私はrabbitmqで新しいユーザーを作成し、明示的に権限を割り当てました。私は実際にキューBeanを宣言せずにキュー名を使用しようとしました。私はキューとRabbitAdminを他のBeanに注入しようとしましたが、それらを強制的に作成するようにしました。

どんなに私は、私は次のエラーを取得しようとするどのような:

2017-04-24 17:42:19.709 WARN 37360 --- [cTaskExecutor-1] o.s.a.r.listener.BlockingQueueConsumer : Failed to declare queue:"incoming" 
2017-04-24 17:42:19.715 WARN 37360 --- [cTaskExecutor-1] o.s.a.r.listener.BlockingQueueConsumer : Queue declaration failed; retries left=3 

org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):["incoming"] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:621) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:520) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1382) [spring-rabbit-1.7.1.RELEASE.jar:na] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121] 
Caused by: java.io.IOException: null 
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:101) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:123) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:992) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:50) ~[amqp-client-4.0.2.jar:4.0.2] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121] 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:955) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at com.sun.proxy.$Proxy77.queueDeclarePassive(Unknown Source) ~[na:na] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:600) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    ... 3 common frames omitted 
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue '"incoming"' in vhost '/', class-id=50, method-id=10) 
    at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:32) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:366) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:229) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:117) ~[amqp-client-4.0.2.jar:4.0.2] 
    ... 12 common frames omitted 
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue '"incoming"' in vhost '/', class-id=50, method-id=10) 
    at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:505) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:336) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:143) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:90) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:634) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:572) ~[amqp-client-4.0.2.jar:4.0.2] 
    ... 1 common frames omitted 

それはそれを作成していないことに気付いていないの後にキューに接続するために失敗しているかどうかを判断するために実際にはかなり難しいのかそれが最初の作成で失敗している場合。

ドッカー固有のドキュメントには、ドッカーのコンテナ内で実行するときにキューを明示的に作成する必要があることは記載されていません。キューを作成できるようにする必要があります。

リスト・キューでも空のリストが表示されないため、構成しようとしているキューのキュー構成が一致していないため、問題ありません。

すべてが完全に明示的にする試みで、私は次のような構成クラス持っている:

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) 
@EnableRabbit 
public class Application { 

    @Bean 
    @ConfigurationProperties("spring.datasource") 
    public DataSource dataSource() { 
    return DataSourceBuilder.create().build(); 
    } 

    @Autowired 
    public ConnectionFactory connectionFactory; 

    @Bean 
    public RabbitAdmin rabbitAdmin() { 
    return new RabbitAdmin(connectionFactory); 
    } 

    @Bean 
    public Queue incomingQueue() { 
    Queue queue = new Queue("${ep.service.baseline.listen.rabbitq.name}", true, false, false, null); 
    return queue; 
    } 

    @Bean 
    public Queue outboundQueue() { 
    return new Queue("${ep.service.baseline.send.rabbitq.name}", true, false, false, null); 
    } 

    @Bean 
    TopicExchange exchange() { 
    return new TopicExchange("default-exchange", true, false); 
    } 

    @Bean 
    Binding incomingBinding(@Qualifier("incomingQueue") Queue queue, TopicExchange exchange) { 
    return BindingBuilder.bind(queue).to(exchange).with(queue.getName()); 
    } 
    @Bean 
    Binding outboundBinding(@Qualifier("outboundQueue") Queue queue, TopicExchange exchange) { 
    return BindingBuilder.bind(queue).to(exchange).with(queue.getName()); 
    } 
    public static void main(String[] args) throws Exception { 

    SpringApplication.run(Application.class, args); 
    } 
} 

を、私のリスナーが次のように宣言されている:

@RabbitListener(queues = "${ep.service.baseline.listen.rabbitq.name}") 
@Component 
public class IncomingMessageProcessor { 
    private final Logger log = LoggerFactory.getLogger(IncomingMessageProcessor.class); 

    @RabbitHandler 
    public void process(@Payload String msg) { 
    log.info("received message: {}", msg); 
    } 
} 

そして、私は次のエラーを受け取ります:

2017-04-24 18:06:54.551 ERROR 38157 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

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) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:151) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:114) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:879) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at com.ep.service.baseline.Application.main(Application.java:65) [classes/:na] 
Caused by: org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:846) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:552) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry.startIfNecessary(RabbitListenerEndpointRegistry.java:279) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry.start(RabbitListenerEndpointRegistry.java:235) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:175) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    ... 14 common frames omitted 
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:548) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1382) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_121] 
Caused by: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):["incoming"] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:621) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:520) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    ... 2 common frames omitted 
Caused by: java.io.IOException: null 
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:101) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:123) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:992) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:50) ~[amqp-client-4.0.2.jar:4.0.2] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121] 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:955) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    at com.sun.proxy.$Proxy97.queueDeclarePassive(Unknown Source) ~[na:na] 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:600) ~[spring-rabbit-1.7.1.RELEASE.jar:na] 
    ... 3 common frames omitted 
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue '"incoming"' in vhost '/', class-id=50, method-id=10) 
    at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:32) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:366) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:229) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:117) ~[amqp-client-4.0.2.jar:4.0.2] 
    ... 12 common frames omitted 
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue '"incoming"' in vhost '/', class-id=50, method-id=10) 
    at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:505) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:336) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:143) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:90) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:634) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47) ~[amqp-client-4.0.2.jar:4.0.2] 
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:572) ~[amqp-client-4.0.2.jar:4.0.2] 
    ... 1 common frames omitted 

ウサギのログは次のようになります。

=INFO REPORT==== 24-Apr-2017::23:19:55 === 
accepting AMQP connection <0.917.0> (172.17.0.1:42196 -> 172.17.0.3:5672) 

=INFO REPORT==== 24-Apr-2017::23:19:55 === 
Connection <0.917.0> (172.17.0.1:42196 -> 172.17.0.3:5672) has a client-provided name: rabbitConnectionFactory#0 

=INFO REPORT==== 24-Apr-2017::23:19:55 === 
connection <0.917.0> (172.17.0.1:42196 -> 172.17.0.3:5672 - rabbitConnectionFactory#0): user 'guest' authenticated and granted access to vhost '/' 

=ERROR REPORT==== 24-Apr-2017::23:19:57 === 
Channel error on connection <0.917.0> (172.17.0.1:42196 -> 172.17.0.3:5672, vhost: '/', user: 'guest'), channel 1: 
operation queue.declare caused a channel exception not_found: no queue '"incoming"' in vhost '/' 

=ERROR REPORT==== 24-Apr-2017::23:20:02 === 
Channel error on connection <0.917.0> (172.17.0.1:42196 -> 172.17.0.3:5672, vhost: '/', user: 'guest'), channel 1: 
operation queue.declare caused a channel exception not_found: no queue '"incoming"' in vhost '/' 

答えて

0

ドッカーやブローカの場所とは関係ありません。あなたのキュー名を中心にいくつかのスプリアス""を持っているように見えます

...

応答コード= 404、返信テキストを= NOT_FOUND - バーチャルホストではありませんキュー'"incoming"' '/'

'内の"に注意してください)。

このプロパティには何がありますかep.service.baseline.listen.rabbitq.name?また

、これは動作しません...

Queue queue = new Queue("${ep.service.baseline.listen.rabbitq.name}", true, false, false, null); 

あなたがプロパティのプレースホルダを使用することはできません。これにより、${ep.service.baseline.listen.rabbitq.name}という名前のキューが作成されます。ウサギは、その命名規則で非常に自由です。

あなたが使用する必要があります...

@Value("${ep.service.baseline.listen.rabbitq.name}") 
private String queueName; 

@Bean 
public Queue incomingQueue() { 
    Queue queue = new Queue(this.queueName, true, false, false, null); 
    return queue; 
} 

デバッグログは、常にあなたの友達です。すべてのキュー宣言がログに記録されます。

+0

ありがとうございました。 2つ目の問題は、それを正常に動作させるためにあらゆる方法を試してみたものですが、私の通常のコードの一部ではありませんでしたが、最初のことでそれを釘付けにしました - 私のプロパティファイルは値を引用していました。エラーメッセージの問題は、値の前後の引用符がそのコンテキストで奇妙に見えないためです。あなたは私がしなかったログで二重引用符を見つけました。 – ideasculptor

+0

@Gary Russell:このhttps://stackoverflow.com/questions/47485314/how-to-implement-dead-letter-exchange-with-multiple-queueに関する考え方 –

関連する問題