весенняя загрузка spring rabbit: как создать шаблон rabbit для отправки сообщения в прослушивателе

#spring-amqp

#spring-amqp

Вопрос:

У меня есть простой прослушиватель, который получает сообщения от Rabbitmq. Я хотел бы изменить сообщение и опубликовать его в новом exchange / queue. Мне не удалось заставить шаблон rabbit работать в прослушивателе. Любая помощь будет оценена. Мой код ниже, когда я попытался автоматически подключить шаблон, я получаю

 Caused by: java.lang.NullPointerException: null
    at com.example.Consumer.onMessage(Consumer.java:27) ~[classes!/:0.0.1-SNAPSHOT]
  

Классы:

 package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class RabbittestApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbittestApplication.class, args);
    }
}


package com.example;

import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
public class RabbitConfig {

    private static final String SIMPLE_MESSAGE_QUEUE = "qDLX1.dlx";

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("RabbitErl19");
        connectionFactory.setUsername("gregg");
        connectionFactory.setPassword("gregg");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("dlxtest");
        return connectionFactory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        return template;
    }



    @Bean
    public SimpleMessageListenerContainer listenerContainer() {
        SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
        listenerContainer.setConnectionFactory(connectionFactory());
        listenerContainer.setQueueNames(SIMPLE_MESSAGE_QUEUE);
        listenerContainer.setMessageListener(new Consumer());
        listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        return listenerContainer;
    }



}

package com.example;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class Consumer implements MessageListener {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void onMessage(Message message) {


        System.out.println("Body: " new String(message.getBody()));


        System.out.println();


        message.getMessageProperties().setExpiration("5000");        
        rabbitTemplate.send("xDLX1.delay", "xq1.retry", message);



    }
}
  

Ответ №1:

Вот ваш код:

 listenerContainer.setMessageListener(new Consumer());
  

Как вы видите, это абсолютно нормально, что @Autowired не работает. Просто потому, что вы обошли внедрение зависимостей.

Поскольку ваш файл Consumer отмечен @Component , вы можете просто ввести его в это SimpleMessageListenerContainer определение компонента:

 @Bean
public SimpleMessageListenerContainer listenerContainer(Consumer consumer) 
  

Ответ №2:

Спасибо, что сделал это, я изменил свой код на то, что приведено ниже, и это сработало. Мы высоко ценим вашу помощь!

 @Autowired
private Consumer consumer;


@Bean
public SimpleMessageListenerContainer listenerContainer() {
    SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();        
    listenerContainer.setConnectionFactory(connectionFactory());
    listenerContainer.setQueueNames(SIMPLE_MESSAGE_QUEUE);
    listenerContainer.setMessageListener(consumer);
    listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
    return listenerContainer;
}