Как установить опцию повторной доставки ActiveMQ (JMS) весной - PullRequest
0 голосов
/ 03 октября 2019

Я использую Spring и ActiveMQ imp спецификации JMS. Теперь я пытаюсь установить опцию повторной доставки, если обработка сообщений не выполняется на клиенте. Для этого я сделал следующее. Я создал одно соединение Factory с RedelieveryPolicy.

@Bean(name = "connectionFactory")
public ActiveMQConnectionFactory connectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setMaximumRedeliveries(3);
    redeliveryPolicy.setMaximumRedeliveryDelay(2000);
    connectionFactory.setRedeliveryPolicy(redeliveryPolicy);
    connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
    connectionFactory.setTrustedPackages(Arrays.asList("com.solution"));
    return connectionFactory;
}

Вот код JMSTemplate ...

@Bean(name="jmsJobTopicTemplate")
@Lazy
public JmsTemplate jmsTopicTemplate(@Qualifier("messageConverter") final MappingJackson2MessageConverter messageConverter) {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(atsConnectionFactory());
    jmsTemplate.setMessageConverter(messageConverter);
    jmsTemplate.setPubSubDomain(true);
    return jmsTemplate;
}

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

Но это решение не работает для меня.

@JmsListener(destination = JMSConstants.DATA_QUEUE)
    @SendTo(value = "return.queqe")
    public boolean receiveMessage(final EntityEvent entityEvent) {
        log.info("Event Recived with payload [{}] ", entityEvent.toString());

        setTenantId(entityEvent, tenant);
        log.debug("Now processing event *********");
        boolean evtStatus = processEvent(entityEvent);
        log.debug("Processing completed *********");

        count++;
        if(count % 2 == 0) {
            throw new RuntimeException();
//          return false;
        }
        return evtStatus;
    }

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

Заранее спасибо.

...