Java Spring отправляет сообщение в очередь от потребителя - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть служба, которая отправляет сообщение rabbitmq, и потребитель делает некоторые манипуляции с сообщением и ставит их в очередь.

Я могу успешно отправить rabbitmq исходное сообщение, но проблема в том, что я не могу повторно отправить rabbitmq любое использованное сообщение, если сообщение требует изменений.

@Service
public class MyService {

    /**
     * The template
     */
    @Autowired
    private AmqpTemplate amqpTemplate;
    private final RabbitMQConfig config;

    public void send(String message) {
        try {
            amqpTemplate.convertAndSend("ex", "r", message);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Тогда в моем конфиге у меня есть настройки: @Bean public ConnectionFactory connectionFactory () {/ * рабочий код * /}

@Bean
public Queue myQueue() { return new Queue("my-queue"); 
// etc...

@Bean
MessageListenerAdapter myListenerAdapter(MyListener listener) {
    return new MessageListenerAdapter(listener, "listener");
}

@Bean
MyListener myListener() {
    return new MyListener();
}

тогда ...

public class MyListener {
    public void receiveMessage(String message) { 
        // ... some code
        // if message requires modification, then repush
        new Repush().push(message);
    }
}

Я пытался создать новый класс с новым, но myService всегда пусто

@Component
public class Repush {
    @Autowired
    private MyService myService;

    public void push(String message) {
        // myService is null at this point
    }
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Не используйте new для создания бина.Spring вводит поля только в бобах.Ваш MyListener - это боб.Просто добавьте Repush поле с @Autowired аннотацией в этом классе.

public class MyListener {
    @Autowired
    private Repush repush;

    public void receiveMessage(String message) { 
        // ... some code
        // if message requires modification, then repush
        repush.push(message);
    }
}
0 голосов
/ 14 ноября 2018

Если вы объявляете myService как компонент в контексте приложения, а Repush как компонент, вы можете затем внедрить его в MyListener, используя @ Autowired.

Создавая Repush с использованием new в определенный момент времени в методе слушателя, вы не получаете компонент, который знает контекст, в котором вы находитесь.

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