jms:listener-容器确认="transacted" 不工作

jms:listener-container acknowledge="transacted" not working

我们正在尝试使用 Spring JMS 实现持久订阅者。下面给出了我如何配置持久订阅者。我们正在使用 Jackson 消息转换器,将传入的 JSON 转换为 java 对象。

据我了解,如果我们提到 destination-type="durableTopic"acknowledge="transacted"在 jms:listener-container 中,如果在订阅者中处理消息时抛出异常,则会发生消息重新传递。但是,对于我们来说,如果我们在订阅者端遇到异常,则不会发生消息重新传递。我还在下面给出了 java 代码片段。

我们想将消息保存到数据库中。所以,我们尝试了一个数据库没有启动的场景。因此,这里抛出了异常 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up,但在此之后不会重新传递消息,而我们希望在这种情况下重新传递消息(至少重试 2-3 次)。

此外,我在一个简单的 Spring MVC 应用程序中尝试了相同的配置和代码,并且只要应用程序中发生异常,就会重新发送消息。因此,无法理解在这种情况下出了什么问题。有人可以在这里帮助我们,确定配置或代码有什么问题吗?

根目录下的配置-context.xml

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
 <constructor-arg index="0" value="tcp://localhost:61616" />
</bean>
 
<bean id="messageConverter" class="org.springframework.jms.support.converter.MappingJackson2MessageConverter">
 <property name="typeIdPropertyName" value="__type" />
</bean>

<jms:listener-container connection-factory="amqConnectionFactory" destination-type="durableTopic" message-converter="messageConverter" acknowledge="transacted" client-id="svcOrdersSubscriber">
     <jms:listener destination="topicOrders" ref="ordersSubscriber" method="receive" subscription="ordersSubscription" />
</jms:listener-container>
<jms:listener-container connection-factory="amqConnectionFactory" destination-type="durableTopic" message-converter="messageConverter" acknowledge="transacted" client-id="svcResultsSubscriber">
     <jms:listener destination="topicResults" ref="resultsSubscriber" method="receive" subscription="resultsSubscription" />
</jms:listener-container>

Java代码

@Component("ordersSubscriber")
public class OrdersSubscriber {
    @Autowired
    OrderService orderService;

    public void receive(Order order) {
        orderService.saveOrders(order);
    }

    public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }   
}

问题已解决。我在我的 MVC 应用程序中使用了简单的 ActiveMQConnectionFactory,而在这里我们使用了 ActiveMQXAConnectionFactory,但我认为由于容器不支持 XA,事务没有发生。现在,我们切换到简单的 ActiveMQConnectionFactory,一切正常。