【问题标题】:jms:listener-container acknowledge="transacted" not workingjms:listener-container acknowledge="transacted" 不工作
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多