Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RabbitMQ Spring模板在发送15条消息后抛出使用封闭通道的尝试_Java_Spring_Rabbitmq_Amqp_Spring Amqp - Fatal编程技术网

Java RabbitMQ Spring模板在发送15条消息后抛出使用封闭通道的尝试

Java RabbitMQ Spring模板在发送15条消息后抛出使用封闭通道的尝试,java,spring,rabbitmq,amqp,spring-amqp,Java,Spring,Rabbitmq,Amqp,Spring Amqp,我第一次尝试RabbitMQ,并决定使用Spring AMQP包装器。我计划先测试写入性能,然后将发送方设置为队列: 弹簧设置: <rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" /> <rabbit:admin connection-factory="connectio

我第一次尝试RabbitMQ,并决定使用Spring AMQP包装器。我计划先测试写入性能,然后将发送方设置为队列:

弹簧设置:

<rabbit:connection-factory id="connectionFactory" host="localhost" 
                           username="guest" password="guest" />

<rabbit:admin connection-factory="connectionFactory" />

<rabbit:template id="myTemplate" connection-factory="connectionFactory"
                 exchange="myQueue"/>

为什么会这样?

看看您的兔子配置

您的amqp模板“myTemplate”已与exchange“myQueue”一起设置。。可以吗?是否有名为“myQueue”的交换,或者这是您的队列名称?如果没有,请创建一个exchange,然后将该路由密钥设置为所需队列


如果设置了无效的Exchange,则不会为模板打开/获取任何通道,从而导致ALREADCYCLOSEDEXCEPTION。

正如Diogo所述,通道上的任何无效操作(例如,试图从不存在的队列中消费)都会导致通道关闭。一旦通道关闭,它就不能再使用-这就是为什么您会看到AlreadCyclosedException


如果意外的通道或连接关闭是一个问题,您可以使用类似客户端的程序自动恢复它们。

打开调试日志以了解关闭连接的原因。我只是做了一个相同的测试,没有问题。
    ApplicationContext context = new ClassPathXmlApplicationContext(
                                             "th/rabbit-sender-context.xml");
    AmqpTemplate aTemplate = (AmqpTemplate) context.getBean("myTemplate");

    int total = 1000;
    for (int i = 0; i < total; i++) {
        System.out.println(i);
        aTemplate.convertAndSend("my.routingkey.1", "#"+i+" on "+new Date());
    }
Caused by: com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190)
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:291)
at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:636)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:365)
at com.sun.proxy.$Proxy4.basicPublish(Unknown Source)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doSend(RabbitTemplate.java:675)
at org.springframework.amqp.rabbit.core.RabbitTemplate$1.doInRabbit(RabbitTemplate.java:351)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:627)
... 9 more