Spring-amqp — более новый прослушиватель вызовов

Извините, я новичок в мире amqp. Я пытаюсь написать простое приложение:

public class HelloApp {

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

    final TestSender bean = context.getBean(TestSender.class);
    bean.sendMessage();

    }
}



@Component
public class TestSender {

    @Autowired
    private RabbitTemplate template;

    public void sendMessage() {

        final Message message = new Message("Sth".getBytes(), new MessageProperties());

        template.send(message);
        System.out.println("Was sent");
    }

}


@Component
public class MessageReceiver implements ChannelAwareMessageListener{

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        System.out.println("RECEIVE "+message.getBody().toString());

    }

И .xml файлов:

spring-amqp.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <rabbit:connection-factory id="connectionFactory" host="localhost"/>
    <rabbit:admin connection-factory="connectionFactory"/>

    <rabbit:template connection-factory="connectionFactory" id="rabbitTemplate" channel-transacted="true"/>
    <rabbit:queue name="userMesssageQueue" />

    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="lis" queue-names="userMesssageQueue"/>
    </rabbit:listener-container>

    <bean id="transactionManager" class="org.springframework.amqp.rabbit.transaction.RabbitTransactionManager">
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>
    <bean id="lis" class="foo.bar.MessageReceiver"/>

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config />
    <context:component-scan base-package="foo.bar"/>


    <import resource="spring-amqp.xml"/>
</beans>

Когда я запускаю это приложение, я вижу:

Was sent

Но хотелось бы увидеть:

Was sent
RECEIVE ...

Что случилось??


person user902691    schedule 19.04.2014    source источник


Ответы (1)


Ваша проблема здесь действительно связана с низким знанием AMQP. Вы должны понимать, что такое Exchange, routingKey и Binding.

Вам необходимо настроить:

<rabbit:direct-exchange name="myExchange">
    <rabbit:bindings>
         <rabbit:binding queue="userMesssageQueue" key="userMesssage" />
    </rabbit:bindings>
</rabbit:direct-exchange>

С другой стороны вы должны отправить сообщение на конкретный exchange, используя конкретный routingKey. В твоем случае:

template.send("myExchange", "userMesssage", message);

Только в этом случае ваше сообщение будет помещено в папку userMesssageQueue.

По умолчанию RabbitTemplate использует пустую строку для exchange (по умолчанию) и пустую строку для routingKey. Поскольку ваш userMesssageQueue не привязан к этому обмену с этим ключом маршрутизации, ваш слушатель не получит его.

Отправка работает без ошибок, т.к. сообщения размещаются на биржах и их достаточно для Producer (отправителя).

В конце концов, ваше сообщение просто отбрасывается брокером RabbitMQ, потому что нет очередей, привязанных к ключу маршрутизации "".

Пожалуйста, ознакомьтесь с дополнительной документацией на сайте RabbitMQ и Spring AMQP.

person Artem Bilan    schedule 19.04.2014
comment
Спасибо, я начал изучать RabbitMQ и Spring AMQP несколько часов назад. Я думаю, что лучший способ чему-то научиться — это учиться на собственном примере и собственных ошибках. - person user902691; 19.04.2014