Интеграция Spring 3 и Rabbit MQ (не Spring Boot) - PullRequest
0 голосов
/ 31 октября 2019

Мне трудно заставить приложение Spring 3 интегрироваться с RabbitMQ, чтобы получать сообщения из очереди (мне не нужно отправлять сообщения).

Большая часть проблемы связана сдокументация теперь относится к Spring Boot. Полезное руководство по пружине полезно, но выполнение следующих шагов в моем случае не работает. Например, руководство включает в себя текст:

Контейнер слушателя сообщений и компоненты-получатели - все, что вам нужно для прослушивания сообщений.

Итак, я настроил контейнер слушателяи приемные компоненты со следующим кодом.

Настройка обработчика сообщений

@Component
public class CustomMessageHandler {

    public void handleMessage(String text) {
        System.out.println("Received: " + text);
    }
}

Настройка конфигурации

@Configuration
public class RabbitConfig {

    @Bean
    public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory){
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setRoutingKey("queue-name");
        return rabbitTemplate;
    }

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost("...host...");
        connectionFactory.setPort(5671);
        connectionFactory.setVirtualHost("...virtual host..");
        connectionFactory.setUsername("...username...");
        connectionFactory.setPassword("...password...");
        return connectionFactory;
    }

    @Bean
    public MessageListenerAdapter messageListenerAdapter(CustomMessageHandler messageHandler) {
        return new MessageListenerAdapter(messageHandler, "handleMessage");
    }

    @Bean
    public SimpleMessageListenerContainer listenerContainer(ConnectionFactory connectionFactory,
                                                            MessageListenerAdapter messageListenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setQueueNames("queue-name");
        container.setConnectionFactory(connectionFactory);
        container.setMessageListener(messageListenerAdapter);
        return container;
    }
}

К сожалению, с этой настройкой приложение запустится, но оно никогда не вызовет обработчик сообщений. В очереди, из которой она пытается прочитать, также есть одно сообщение, которое находится в ожидании, чтобы быть использованным.

Есть идеи о том, что отсутствует или кажется неправильно настроенным?

1 Ответ

1 голос
/ 31 октября 2019

Благодаря некоторой помощи по управлению зависимостями от @GaryRussell, я смог увидеть, что версии spring-rabbit и spring-amqp были слишком свежими. Использование более старой версии 1.3.9.RELEASE, к сожалению, добавило дополнительных проблем.

Некоторая другая помощь пришла в виде использования реального клиента RabbitMQ Java. Эта опция была намного проще в реализации и позволяла избежать проблем с зависимостями. В конечном счете мне нужно было включить следующую зависимость:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.7.3</version>
</dependency>

А затем я просто следовал их документации по , создавая соединение и потребляя сообщения .

Вуаля, все работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...