Повторите планирование сообщения для доставки ActiveMQ, используя jmsTemplate (Spring JMS) - PullRequest
0 голосов
/ 25 февраля 2019

Я отправляю сообщение в очередь следующим образом:

Я хочу запланировать повтор моего сообщения.Я имею в виду, что независимо от того, какое сообщение отправляет моя эта строка jsmClient.send(identifier); в контроллере (показано ниже), я хочу продолжать отправку, скажем, 10 или 100 раз (в зависимости от установленного таймера).Мой потребитель (не показан ниже) будет продолжать потреблять одно и то же сообщение, пока я не прошу его прекратить.Например, даже если мой производитель собирается отправить сообщение 10 или 100 раз, если я хочу прекратить получать сообщение в 5-й раз (в случае, если производитель отправил сообщение 10 раз) или в 50-й раз (в случае, если производитель отправил сообщение 100раз), я должен быть в состоянии сделать это.

Поскольку я использую JMS 2 и ActiveMQ (версия 5.15.8), я не могу выяснить следующее:

Документация Задержка и планирование доставки сообщений говорит о AMQ_SCHEDULED_REPEAT в следующем разделе:

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long delay = 30 * 1000;
long period = 10 * 1000;
int repeat = 9;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
producer.send(message);

Если я правильно понял, приведенный выше код рассматривает не JMS 2, а JMS 1.1?Мне интересно, какие изменения мне нужно внести в мой код ниже, чтобы я мог сделать что-то вроде этого message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);.Я не смог найти много полезной информации о повторении расписания в документации Spring .

Мой класс JmsProducer:

@Component
public class JmsProducer {
    @Autowired
    JmsTemplate jmsTemplate;

    @Value("${jms.queue.destination}")
    String destinationQueue;

    public void send(String msg){
        jmsTemplate.convertAndSend(destinationQueue, msg);
    }
}

Интерфейс JmsClient:

public interface JmsClient {
    public void send(String msg);

}

Класс JmsClientImpl:

@Service
public class JmsClientImpl implements JmsClient{


    @Autowired
    JmsProducer jmsProducer;

    @Override
    public void send(String msg) {
        jmsProducer.send(msg);
    }


}

В моем REST-контроллере я отправляю сообщение, подобное этому:

try {

            DataRetrieverDao dataRetrieverDao = (DataRetrieverDao) context.getBean("dataRetrieverDao");
            String identifier=dataRetrieverDao.sendDownloadInfo(user_id);
            logger.info("VALUE OF STRING: "+identifier);
            jsmClient.send(identifier);



        }

Основываясь на моих исследованиях:

В этот поток стекового потока , JMS 2.0 не поддерживается в пакете activemq, поэтому я должен вместо этого переключиться на artemis?Но тогда вопросы, которые я задавал со стороны jmsTemplate выше, все еще в моей голове.Пожалуйста, посоветуйте мне, как лучше поступить в этой ситуации.Спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

Способ доставки с отложенной и запланированной доставкой сообщений в ActiveMQ 5.x заключается в том, что производитель устанавливает задержку / расписание для сообщения с помощью специальных свойств и отправляет сообщение один раз .Как только брокер получит сообщение, он доставит сообщение в очередь на основе задержки и графика, установленных в сообщении.Следовательно, неверно говорить «... мой производитель отправит сообщение 10 или 100 раз ...» в контексте отложенных и запланированных сообщений.

Отложенная и запланированная доставка сообщенийособенность ActiveMQ 5.x и не является частью спецификации JMS.В библиотеках и / или документации Spring JMS эта функция не упоминается, поскольку она уникальна для ActiveMQ 5.x.

Как вы заметили, ActiveMQ 5.x не поддерживает JMS 2.0, поэтому, если вам нужна поддержка JMS 2.0вам нужно переключиться на ActiveMQ Artemis.Однако ActiveMQ Artemis не поддерживает отложенные и запланированные сообщения , как обсуждалось в списке рассылки пользователя .Поэтому, если вы хотите отложить и запланировать сообщения, вы можете придерживаться JMS 1.1 или найти другой способ реализации функциональности, которую вы ищете с JMS 2.0 и ActiveMQ Artemis.

...