【发布时间】:2015-09-10 06:42:10
【问题描述】:
我们正在尝试使用 Spring JMS 实现持久订阅者。下面给出了我如何配置持久订阅者。我们正在使用 Jackson 消息转换器,将传入的 JSON 转换为 java 对象。
据我了解,如果我们在 jms:listener-container 中提到 destination-type="durableTopic" 和 acknowledge="transacted",则消息重新传递如果在订阅者中处理消息时抛出异常,则会发生。但是,对我们来说,如果我们在订阅者端遇到异常,则不会发生消息重新传递。下面我也给出了java代码sn-p。
我们想将消息保存到数据库中。所以,我们尝试了一个没有启动数据库的场景。因此,这里抛出了异常com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up,但在此之后没有发生消息重新传递,而我们希望在这种情况下重新传递消息(至少重试 2-3 次)。
此外,我在一个简单的 Spring MVC 应用程序中尝试了相同的配置和代码,并且每当应用程序中发生异常时,消息都会重新传递。因此,无法理解在这种情况下出了什么问题。有人可以在这里帮助我们,找出配置或代码的问题吗?
root-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 应用程序中“工作”,它将在独立的 JVM 中工作。尝试打开 DEBUG 日志并比较两个日志。
-
谢谢加里,我检查了两个地方的日志,我得到了同样的异常: org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'receive' throw exception;嵌套异常是...但消息重新传递仍然失败。
-
但是,我在示例 MVC 日志中看到这样的日志语句:DEBUG org.apache.activemq.TransactionContext - Begin:TX:ID:Venkatesh-PC-49787-1441952295550-1 :1:1。同样的日志,我无法在实际应用程序中看到。不知道为什么 TransactionContext - Begin 没有发生。
标签: jms spring-jms