Java Spring amqp RabbitMQ-无交换';myexchange';在vhost'/';错误

Java Spring amqp RabbitMQ-无交换';myexchange';在vhost'/';错误,java,rabbitmq,spring-amqp,spring-rabbit,Java,Rabbitmq,Spring Amqp,Spring Rabbit,我知道以前有人问过这个问题,但我找不到任何合适的解决方案,因此再次发布 我正在尝试使用spring amqp编写rabbitmq生产者,以在直接队列上发布我的消息。由于它是生产者应用程序,因此必须创建我的exchange和队列。此外,我没有定义任何侦听器bean,因为我在生产者端不需要它。 下面是我的rabbitmq config.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sprin

我知道以前有人问过这个问题,但我找不到任何合适的解决方案,因此再次发布

我正在尝试使用spring amqp编写rabbitmq生产者,以在直接队列上发布我的消息。由于它是生产者应用程序,因此必须创建我的exchange和队列。此外,我没有定义任何侦听器bean,因为我在生产者端不需要它。 下面是我的rabbitmq config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.5.xsd
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Spring AMQP Admin -->
<rabbit:admin id="amqpAdmin"
    connection-factory="rabbitmqConnectionFactory"
    auto-startup="true" />

<!-- Spring AMQP Template -->
<rabbit:template id="amqpTemplate"
    connection-factory="rabbitmqConnectionFactory"
    routing-key="my.key" exchange="my.exchange" 
    channel-transacted="true"/>

<!-- Connection Factory -->
<rabbit:connection-factory id="rabbitmqConnectionFactory"
    host="${rabbitmq.host:localhost}" 
    port="${rabbitmq.port:5672}" 
    username="${rabbitmq.username}"
    password="${rabbitmq.password}" 
    virtual-host="${rabbitmq.vhost:/}"
    cache-mode="CONNECTION" 
    channel-cache-size="${rabbitmq.channel-cache-size:25}" />

<!-- Queue and Exchange -->
<rabbit:queue id="my.queue" durable="false"
    auto-declare="true" auto-delete="true" />

<rabbit:direct-exchange name="my.exchange" durable="false"
    auto-declare="true" auto-delete="true" declared-by="amqpAdmin">
    <rabbit:bindings>
        <rabbit:binding queue="my.queue" key="my.key"/>
    </rabbit:bindings>
</rabbit:direct-exchange>
</beans>

我只有一个简单的producer类,它使用上面的amqpmodel发送消息。 但当我尝试运行producer应用程序时,我得到的只是: vhost'/'中没有交换'my.exchange'错误

错误CachingConnectionFactory:1089-通道关闭:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'/'中没有交换'my.exchange',类id=60,方法id=40)
调试CachingConnectionFactory:842-检测到异常时关闭通道。重新初始化:AMQChannel(amqp://s3conn@127.0.0.1:5672/,1)
调试RabbitResourceHolder:189-将消息回滚到通道:缓存的兔子通道:AMQChannel(amqp://s3conn@127.0.0.1:5672/,1),康涅狄格州:Proxy@17a7f733专用兔子连接:SimpleConnection@2118cddf[代表=amqp://s3conn@127.0.0.1:5672/]
跟踪缓存连接工厂:906-返回缓存通道:AMQChannel(amqp://s3conn@127.0.0.1:5672/,1)
线程“main”中出现异常
调试CachingConnectionFactory:1008-返回连接'Proxy@17a7f733专用兔子连接:SimpleConnection@2118cddf[代表=amqp://s3conn@127.0.0.1:5672/]'以缓存
org.springframework.amqp.AmqpIOException:java.io.IOException
位于org.springframework.amqp.rabbit.connection.RabbitUtils.commitifneedly(RabbitUtils.java:105)
位于org.springframework.amqp.rabbit.core.rabbitmplate.doSend(rabbitmplate.java:1354)
位于org.springframework.amqp.rabbit.core.rabbitmplate$3.doInRabbit(rabbitmplate.java:623)
位于org.springframework.amqp.rabbit.core.rabbitmplate.doExecute(rabbitmplate.java:1298)
位于org.springframework.amqp.rabbit.core.rabbitmplate.execute(rabbitmplate.java:1271)
位于org.springframework.amqp.rabbit.core.rabbitmplate.send(rabbitmplate.java:619)
位于org.springframework.amqp.rabbit.core.rabbitmplate.send(rabbitmplate.java:613)
位于org.springframework.amqp.rabbit.core.rabbitmplate.send(rabbitmplate.java:603)
位于com.symantec.spe.cloud.amqpclient.JsonMessagePublisherImpl.sendMessage(JsonMessagePublisherImpl.java:53)
位于com.symantec.spe.cloud.amqpclient.test.TestProducer.main(TestProducer.java:50)
原因:java.io.IOException
位于com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
位于com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
位于com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:124)
位于com.rabbitmq.client.impl.ChannelN.txCommit(ChannelN.java:1163)
位于com.rabbitmq.client.impl.ChannelN.txCommit(ChannelN.java:61)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:835)
位于com.sun.proxy.$Proxy7.txCommit(未知源)
在org.springframework.amqp.rabbit.connection.RabbitUtils.commitifrequired上(RabbitUtils.java:103)
... 9更多
原因:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-无交换
vhost'/'中的e'my.exchange',类id=60,方法id=40)
位于com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
位于com.rabbitmq.utility.BlockingValueOrException.UnterruptibleGetValue(BlockingValueOrException.java:33)
在com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:361)
位于com.rabbitmq.client.impl.AMQChannel.privatepc(AMQChannel.java:226)
位于com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118)
... 还有18个
原因:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-无交换
vhost'/'中的e'my.exchange',类id=60,方法id=40)
在com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:484)上
位于com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:321)
位于com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:144)
位于com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:91)
位于com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:554)
位于java.lang.Thread.run(未知源)
在此方面的任何帮助都将不胜感激。谢谢。

您的问题是:

cache-mode="CONNECTION" 
见:

只有当
CachingConnectionFactory
缓存模式为
通道
(默认)时,才会执行自动声明。存在此限制是因为exlusive和auto delete队列绑定到连接


(哎呀!这里有输入错误。很快就会解决:-)

此外,即使使用通道缓存模式,由于exchange和队列都是自动删除的,如果消费者在生产者仍在运行时启动和停止(或以某种方式断开连接),队列和exchange也将被删除;制作人对此一无所知,在这种情况下不会重新申报。@Artem Bilan,谢谢你的帮助。它解决了我的问题。我将缓存模式更改为通道,因为我需要持久和非独占队列,所以我适当地设置了这些字段。@GaryRussell,这对非独占队列也是正确的吗?谢谢。
独占
不相关-
自动删除
队列
cache-mode="CONNECTION"