Пишем образец производителя и потребителя с интеграцией spring и rabbit mq

Я пытаюсь написать образец производителя и потребителя с помощью SpringIntegration и RabbitMQ.

Вот мой файл конфигурации rabbit.xml:

<rabbit:connection-factory id="connectionFactory" />
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:queue name="queue.request" />
<rabbit:queue name="queue.response" />
<rabbit:direct-exchange name="exchange.main">
    <rabbit:bindings>
        <rabbit:binding queue="queue.request" key="binding.queue.request"/>
        <rabbit:binding queue="queue.response" key="binding.queue.response" />
    </rabbit:bindings>
</rabbit:direct-exchange>

и

файл Producer.xml:

<context:annotation-config />
<import resource="classpath:META-INF/zcore/integration/rabbit.xml" />
<int:channel id="request" />
<int:channel id="response" />
<int-amqp:outbound-channel-adapter channel="request" amqp-template="amqpTemplate" 
    exchange-name="exchange.main" routing-key="binding.queue.request"       
<int-amqp:inbound-channel-adapter channel="response" queue-names="queue.response"
     connection-factory="connectionFactory" />  
<int:gateway id="baseGateway" service-interface="org.zcoreframework.integration.gateway.BaseGateway"
    default-request-channel="request" default-reply-channel="response" />   

и

Файл consumer.xml:

<import resource="classpath:META-INF/zcore/integration/rabbit.xml" />
<context:annotation-config />
<context:component-scan base-package="org.zcoreframework" />
<int:channel id="request" /> 
<int:channel id="response" />
<int-amqp:inbound-channel-adapter channel="request" queue-names="queue.request"
     connection-factory="connectionFactory" />  
<int-amqp:outbound-channel-adapter channel="response" amqp-template="amqpTemplate" 
    exchange-name="exchange.main" routing-key="binding.queue.response" />
<int:service-activator ref="messageConsumer" method="onMessage" input-channel="request"
    output-channel="response" />

и я написал этот фрагмент кода для отправки сообщения и получения ответа:

@Autowired
BaseGateway baseGateway;

@Test
public void testHelloWorld() {

        CallMethodMessage callMethodMessage = new CallMethodMessage();
        callMethodMessage.setMethod("test");
        callMethodMessage.setArgs(null);
        System.out.print("send & receive ");            
        ReturnModel returnModel = this.baseGateway.SendWait(callMethodMessage);         
        //this.baseGateway.FireForget(callMethodMessage);
}

и это мой интерфейс

public interface BaseGateway {

    @Gateway
    public void FireForget(CallMethodMessage method);

    @Gateway
    public ReturnModel SendWait(CallMethodMessage method);

}

Хорошо, теперь я запускаю потребителя отдельно, затем для первого запускаю производителя с методом FireForget, и все в порядке, cosumer получает его и печатает сообщение, но когда я запускаю метод SendWait, пользователь получает его, но ничего не возвращает, и производитель ждет, чтобы получить ответ: как я могу справиться с этой проблемой?


person AKZ    schedule 12.02.2014    source источник


Ответы (1)


Нет корреляции для ответа

<int-amqp:outbound-channel-adapter channel="request" amqp-template="amqpTemplate" 
    exchange-name="exchange.main" routing-key="binding.queue.request"       
<int-amqp:inbound-channel-adapter channel="response" queue-names="queue.response"
     connection-factory="connectionFactory" />  

Вместо этого используйте исходящий шлюз; вы можете настроить его с помощью шаблона кролика с <reply-listener/> as обсуждается в документации Spring AMQP.

И используйте шлюз входящей почты на стороне потребителя.

person Gary Russell    schedule 12.02.2014
comment
Я изменил свой код и использую исходящий и входящий шлюз, как вы упомянули, и все в порядке, когда переданный объект между производителем и потребителем является примитивным, например String или int, но когда я пытаюсь передать класс POJO, я получаю эту ошибку: не удается преобразовать значение типа byte [[]] в требуемый тип .... - person AKZ; 15.02.2014
comment
Вам нужен соответствующий MessageConverter; фреймворк предоставляет удобный JsonMessageConverter, который использует Джексона для преобразования POJO в / из Json, если ваш POJO удобен для Джексона. Конвертер по умолчанию (SimpleMessageConverter) обрабатывает String. byte [] и сериализация Java. Сериализация Java требует, чтобы POJO были сериализуемыми - в противном случае отправляется пустое сообщение. Итак, используйте JsonMessageSerializer или сделайте свой POJO сериализуемым (но JSON обычно считается лучшим выбором для AMQP, потому что он удобен для полиглотов). - person Gary Russell; 16.02.2014