spring amqp rabbitmq MessageListener无效

时间:2014-04-20 22:09:57

标签: java spring rabbitmq spring-batch spring-amqp

我正在尝试使用spring amqp使用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>

这是一个简单的Message Listener类,

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;

public class ImportMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
        System.out.println("consumer output: " + message);
    }

}

这是生产者(春天批次的itemWriter),

public class ImportItemWriter<T> implements ItemWriter<T> {

    private AmqpTemplate template;

    public AmqpTemplate getTemplate() {
        return template;
    }

    public void setTemplate(AmqpTemplate template) {
        this.template = template;
    }

    public void write(List<? extends T> items) throws Exception {
        for (T item : items) {
            Object reply = template.convertSendAndReceive(item.toString());
            System.out.println("producer output: " + reply);
        }
    }

}

当我运行spring批处理作业时,会调用ImportItemWriter.write。但是ImportMessageListener.onMessage不起作用。它不打印消息。我得到控制台上所有项目的输出

producer output: null
producer output: null
producer output: null
producer output: null
producer output: null
producer output: null
producer output: null

1 个答案:

答案 0 :(得分:5)

您的消费者没有发送结果......

@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";
}

编辑:

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

convertSendAndReceive("", queueName, item.toString());

EDIT2:

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

...sendAndReceive()方法适用于请求/回复方案,因此需要阻止。要异步执行此操作,您必须使用...send()方法之一,并连接自己的SimpleListenerContainer以接收回复;你必须做自己的关联。使用

public void convertAndSend(Object message, MessagePostProcessor postProcessor)

并在邮件处理器中设置replyTocorrelationId标题...

message.getMessageProperties().setReplyTo("foo");
message.getMessageProperties().setCorrelationId("bar");

或者,自己构建Message对象(例如by using the MessageBuilder)并使用send方法......

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

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