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,一切正常。
我们正在尝试使用 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,一切正常。