Я использую 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;
}
Может ли кто-нибудь помочь мне понять, это правильный поток. Что мне здесь не хватает, чтобы повторно обработать необработанное сообщение после определенной задержки.
Заранее спасибо.