如何在春季设置reDelivery选项ActiveMQ(JMS)

时间:2019-10-03 16:53:16

标签: jms activemq

我正在使用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;
    }

有人可以帮助我理解吗,流程是否正确。 为了在某​​些延迟后重新传递未处理的消息,我在这里所缺少的。

先谢谢了。

0 个答案:

没有答案