Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 Spring AMQP:从POJO侦听器发送回复失败,因为缺少对属性的回复_Java_Spring_Amqp_Spring Amqp - Fatal编程技术网

Java Spring AMQP:从POJO侦听器发送回复失败,因为缺少对属性的回复

Java Spring AMQP:从POJO侦听器发送回复失败,因为缺少对属性的回复,java,spring,amqp,spring-amqp,Java,Spring,Amqp,Spring Amqp,我想编写一个简单的代码示例,它向exchange发送消息,通过侦听器接收消息,然后发送回消息 这是我发送信息的方式: private static void pingpong(Object messageListener) throws Exception { ConnectionFactory cf = new CachingConnectionFactory("localhost"); // set up the queue, exchange, binding on th

我想编写一个简单的代码示例,它向exchange发送消息,通过侦听器接收消息,然后发送回消息

这是我发送信息的方式:

private static void pingpong(Object messageListener) throws Exception {
    ConnectionFactory cf = new CachingConnectionFactory("localhost");

    // set up the queue, exchange, binding on the broker
    RabbitAdmin admin = new RabbitAdmin(cf);
    Queue queue = new Queue(QUEUE);
    admin.declareQueue(queue);
    TopicExchange exchange = new TopicExchange(EXCHANGE);
    admin.declareExchange(exchange);
    admin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("foo.*"));

    // set up the listener and container
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
    container.setMessageListener(messageListener);
    container.setQueueNames(QUEUE);
    container.start();

    // send something and receive result.
    RabbitTemplate template = new RabbitTemplate(cf);
    Object result = template.convertSendAndReceive(EXCHANGE, "foo.bar", "ping");
    System.out.println("Received: " + result);
}
侦听器的代码:

public static class PingPongReceiver {
    public String handleMessage(String in) {
        System.out.println("Received: " + in);
        return "pong";
    }
}
我这样称呼它:

pingpong(new MessageListenerAdapter(new PingPongReceiver()));
但发送回复失败,出现以下例外情况:

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:865)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:760)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:680)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:93)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:183)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1345)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:661)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1096)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1080)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$800(SimpleMessageListenerContainer.java:93)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1190)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.amqp.rabbit.listener.adapter.ReplyFailureException: Failed to send reply with payload 'pong'
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:213)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:296)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:757)
    ... 10 more
Caused by: org.springframework.amqp.AmqpException: Cannot determine ReplyTo message property value: Request message does not contain reply-to property, and no default response Exchange was set.
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.getReplyToAddress(AbstractAdaptableMessageListener.java:289)
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:209)
    ... 12 more

我不知道如何使用匿名、非持久队列发送回复。我遗漏了什么?

你所描述的毫无意义;
RabbitTemplate.convertAndReceive()
设置replyTo(如果代理支持,则为临时队列)

我只是复制并粘贴了你的代码,对我来说效果很好

Received: ping
Received: pong
也许队列中有一条旧的、过时的、没有replyTo的消息

您可以使用管理UI清除队列

我还使用

Queue queue = new AnonymousQueue();
...
container.setQueueNames(queue.getName());
而且效果也不错

顺便说一句,当手动创建Springbean时,建议您调用
AfterPropertieSet
(如果bean是一个初始化bean)

最后,您应该停止容器并破坏连接:

container.stop();
cf.destroy();
container.stop();
cf.destroy();