簡體   English   中英

Spring Amqp RabbitMQ MessageListener不起作用

[英]spring amqp rabbitmq MessageListener not working

我正在嘗試通過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);
        }
    }

}

當我運行春季批處理作業時,將調用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

您的消費者沒有發送結果...

@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());

編輯2:

或者,將模板上的routingKey設置為隊列名稱,然后可以使用更簡單的方法。

...sendAndReceive()方法用於請求/答復方案,因此需要阻止。 要異步執行此操作,您必須使用...send()方法之一,並連接自己的SimpleListenerContainer來接收答復。 您將必須進行自己的關聯。 采用

public void convertAndSend(Object message, MessagePostProcessor postProcessor)

然后在您的消息后處理器中,設置replyTocorrelationId標頭...

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

或者,您自己構建Message對象(例如, 通過使用MessageBuilder )並使用send方法...

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

每個請求都需要一個唯一的correlationId以便您可以關聯響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM