我正在使用JMS规范的Spring和ActiveMQ imp。现在,如果客户端上的消息处理失败,我将尝试设置重新交付选项。为此,我做了以下事情。 我使用RedelieveryPolicy创建了一个connectionFactory。
@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;
}
有人可以帮助我理解吗,流程是否正确。 为了在某些延迟后重新传递未处理的消息,我在这里所缺少的。
先谢谢了。