@SendTo не работает в JMS (интеграция ActiveMQ) с Spring Boot

У меня странная проблема: я не могу отправлять свои сообщения на demoQueue в ActiveMQ, используя только аннотацию @SendTo ("demoQueue"), я пробовал следовать, мне удалось отправить сообщение в очередь с помощью JmsTemplate, но я также прочтите в блоге, что @SendTo сделает это за вас.

Ниже приведен код, который я пробовал, версия, которая не работает.

@Component
public class ProducerTask {
private static final Logger LOG = LoggerFactory.getLogger(ProducerTask.class);
    @Scheduled(cron = "0 0/3 * * * *")
    @SendTo("demoQueue")
    public String pushToQueue() {
        String str = "Running scheduled task >> " + ZonedDateTime.now();
        LOG.info(str);
        return str;
    }
}

Версия с JmsTemplate работает нормально.

@Component
public class ProducerTask {

private static final Logger LOG = LoggerFactory.getLogger(ProducerTask.class);

    @Autowired
    private JmsTemplate jmsTemplate;

    @Scheduled(cron = "0 0/3 * * * *")
    public String pushToQueue() {
        String str = "Running scheduled task >> " + ZonedDateTime.now();
        LOG.info(str);
        jmsTemplate.setDefaultDestinationName("demoQueue");
        jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(str);
            }
        });
        // TODO put the logic for consuming in different bean and inject here and call that method here.
        return str;
    }
}

Объясните, пожалуйста, здесь я запутался. Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 956
1

Ответы 1

Вы не можете использовать аннотацию @SendTo как часть какого-либо метода. Он работает в контексте @JmsListener (или другого слушателя, например @KafkaListener), см. Этот Сообщение блога.

Я смущен, поскольку они использовали два разных имени очереди с @JmsListener и @SendTo, насколько я понял, @JmsListener пытается прочитать сообщение из очереди, а @SendTo отправляет сообщение обратно в очередь в качестве подтверждения, это правильно? Есть ли способ отправить сообщение прямо в очередь (не в качестве подтверждения), используя ту же аннотацию?

Bilbo Baggins 29.10.2018 11:30

Здесь описывается поведение @SentTo. docs.spring.io/spring/docs/current/spring-framework-referenc‌ e /… Он используется только в контексте ответа на сообщение. Чтобы отправить сообщение, вам все равно нужно использовать jmsTemplate. Так что нет, ты не можешь.

AlexB 29.10.2018 13:12

@AlexB, я просто хочу убедиться, что @SendToUser нельзя использовать ни с одним @Listener. Это верно?

RukaDo 10.08.2020 08:19

Другие вопросы по теме