Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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

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 spring amqp rabbitmq MessageListener未工作_Java_Spring_Rabbitmq_Spring Batch_Spring Amqp - Fatal编程技术网

Java spring amqp rabbitmq MessageListener未工作

Java spring amqp rabbitmq MessageListener未工作,java,spring,rabbitmq,spring-batch,spring-amqp,Java,Spring,Rabbitmq,Spring Batch,Spring Amqp,我正在尝试使用SpringAMQP使用rabbitmq,下面是我的配置 <rabbit:connection-factory id="rabbitConnectionFactory" port="${rabbitmq.port}" host="${rabbitmq.host}" /> <rabbit:admin connection-factory="rabbitConnectionFactory" /> <rabbit:queue name="${ra

我正在尝试使用SpringAMQP使用rabbitmq,下面是我的配置

<rabbit:connection-factory id="rabbitConnectionFactory"
    port="${rabbitmq.port}" host="${rabbitmq.host}" />

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

<rabbit:queue name="${rabbitmq.import.queue}" />

<rabbit:template id="importAmqpTemplate"
    connection-factory="rabbitConnectionFactory" queue="${rabbitmq.import.queue}" />

<beans:bean id="importExchangeMessageListener"
    class="com.stockopedia.batch.foundation.ImportMessageListener" />

<rabbit:listener-container
    connection-factory="rabbitConnectionFactory" concurrency="5">
    <rabbit:listener queues="${rabbitmq.import.queue}" ref="importMessageListener" />
</rabbit:listener-container>
这是制作人(是spring batch的itemWriter)


您的消费者没有发送结果

@Override
public void onMessage(Message message) {
    System.out.println("consumer output: " + message);
}
将其更改为简单的POJO;容器的
MessageListenerAdapter
将为您处理转换并发送结果

@Override
public String handleMessage(String message) {
    System.out.println("consumer output: " + message);
    return "result";
}
编辑:

您还没有设置到队列的任何交换或路由。如果要使用默认的exchange/路由,请使用

convertSendAndReceive("", queueName, item.toString());
编辑2:

或者,将模板上的
routingKey
设置为队列名称,然后可以使用更简单的方法

…sendandereceive()
方法用于请求/应答场景,因此需要阻塞。要异步执行,您必须使用
…send()
方法之一,并连接您自己的
SimpleListenerContainer
以接收回复;你必须做你自己的关联。使用

public void convertAndSend(Object message, MessagePostProcessor postProcessor)
在消息后处理器中,将
replyTo
correlationId
标题设置为

message.getMessageProperties().setReplyTo("foo");
message.getMessageProperties().setCorrelationId("bar");
或者,自己构建
消息
对象(例如),并使用
发送
方法

template.send(MessageBuilder.withBody("foo".getBytes())
            .setReplyTo("bar")
            .setCorrelationId("baz".getBytes())
            .build());

每个请求都需要一个唯一的
correlationId
,以便您可以关联响应。

您的消费者没有发送结果

@Override
public void onMessage(Message message) {
    System.out.println("consumer output: " + message);
}
将其更改为简单的POJO;容器的
MessageListenerAdapter
将为您处理转换并发送结果

@Override
public String handleMessage(String message) {
    System.out.println("consumer output: " + message);
    return "result";
}
编辑:

您还没有设置到队列的任何交换或路由。如果要使用默认的exchange/路由,请使用

convertSendAndReceive("", queueName, item.toString());
编辑2:

或者,将模板上的
routingKey
设置为队列名称,然后可以使用更简单的方法

…sendandereceive()
方法用于请求/应答场景,因此需要阻塞。要异步执行,您必须使用
…send()
方法之一,并连接您自己的
SimpleListenerContainer
以接收回复;你必须做你自己的关联。使用

public void convertAndSend(Object message, MessagePostProcessor postProcessor)
在消息后处理器中,将
replyTo
correlationId
标题设置为

message.getMessageProperties().setReplyTo("foo");
message.getMessageProperties().setCorrelationId("bar");
或者,自己构建
消息
对象(例如),并使用
发送
方法

template.send(MessageBuilder.withBody("foo".getBytes())
            .setReplyTo("bar")
            .setCorrelationId("baz".getBytes())
            .build());

每个请求都需要一个唯一的
correlationId
,以便您可以关联响应。

谢谢,我不想从每个ConvertSendReceive调用传递queueName和exchange。如何在模板配置中进行配置?在文档中,配置如上所示。我想使用默认的exchange。感谢添加与队列名称相同的路由密钥!另外,还有一个问题是,它的行为是同步的,每一条消息都被发送和响应,然后下一条消息被发送。我想将5个处理线程处理的5条消息排队,然后是下一批5条消息。我不想让我的生产者等待回复。它应该只是对消息进行排队,并且应该知道何时收到回复@Gary RussellThank,这对我很有用,但我仍然在努力使我的异步用例工作。我无法在中附加我自己的回复消息处理程序。这里有更多的解释,谢谢,我不想在每次ConvertSend和Receive呼叫中传递queueName和exchange。如何在模板配置中进行配置?在文档中,配置如上所示。我想使用默认的exchange。感谢添加与队列名称相同的路由密钥!另外,还有一个问题是,它的行为是同步的,每一条消息都被发送和响应,然后下一条消息被发送。我想将5个处理线程处理的5条消息排队,然后是下一批5条消息。我不想让我的生产者等待回复。它应该只是对消息进行排队,并且应该知道何时收到回复@Gary RussellThank,这对我很有用,但我仍然在努力使我的异步用例工作。我无法在中附加我自己的回复消息处理程序。这里有更多的解释