2017-04-25 84 views
1

我已經失去了整整一天的時間,試圖讓spring-amqp示例項目運行並對docker版本的rabbitmq運行。我只是運行標準的rabbitmq docker。儘管我沒有連接問題,但我總是會獲得與創建隊列有關的異常,並且我嘗試了所有可能的變體。如何使用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 

這實際上是相當困難的決定,如果它失敗沒有注意到,它並沒有創造它之後連接到隊列或如果它在初始創建時失敗。

在Docker特定的任何文檔中都沒有提到暗示隊列需要在Docker容器中運行時顯式創建,並且在容器內部挖掘,我根本找不到配置,我認爲這暗示了它應該被允許創建隊列。

不僅如此,列表隊列還會顯示一個空列表,所以這對於我嘗試配置的隊列中不匹配的隊列配置沒有問題。

在試圖使一切完全明確的,我已經得到了以下配置類:

@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

謝謝。第二個問題只是嘗試使用所有東西來實現它的工件,並不是我普通代碼的一部分,但是你用第一個東西來釘住它 - 我的屬性文件引用了值,然後我沒有看到錯誤消息中的問題是因爲在該上下文中引號的值並不奇怪。你在日誌中發現了我沒有的雙引號。 – ideasculptor

+0

@加里·拉塞爾:對此的任何想法https://stackoverflow.com/questions/47485314/how-to-implement-dead-letter-exchange-with-multiple-queue –