4

我的应用程序(弹簧消息侦听器)从队列中读取并在单个事务中写入数据库。我使用 Atomikos 来提供 XA 事务行为。例如,当应用程序被 kill 语句突然终止时,我看到消息丢失了。我需要使用任何特定配置吗?队列应该是持久的吗?目前,队列是非持久的。我的 MQ 版本是 v7.1。

侦听器容器的 Spring 配置如下所示:

<bean id="listenerContainer" class="com.miax.test.TestListenerMDPImpl" autowire="byName">
    <property name="connectionFactory" ref="mqConnFactory" />
    <property name="destinationName" value="QUEUE" />
    <property name="messageListener" ref="listenerAdapter" />
    <property name="transactionManager" ref="jtaTransactionManager" />
    <property name="sessionTransacted" value="true" />
    <property name="concurrentConsumers" value="1" />
    <!-- receive time out, should be less than tranaction time out -->
    <property name="receiveTimeout" value="3000" />
    <!-- retry connection every 1 seconds -->
    <property name="recoveryInterval" value="1000" />
    <property name="autoStartup" value="true" />
    <property name="sessionAcknowledgeMode" value="0" />
</bean>

任何其他信息将根据需要提供。

谢谢。

4

1 回答 1

4

如果在今年 5 月之前下载,您使用的客户端必须是扩展事务客户端。自 2012 年 5 月起,任何 V7.0.1 及更高版本的客户端都内置了 XA 功能。如有疑问,请下载 WMQ 客户端的当前版本并安装。

其次,XA 事务管理器必须有它自己的与独立于应用程序的队列管理器的连接。这样它就可以在应用程序无法重新启动时连接和协调事务。为此,事务管理器必须配置一个 XX_OPEN 字符串和一个开关文件,如信息中心主题配置符合 XA 的事务管理器中所述。

就其价值而言,WMQ 中不存在持久队列之类的东西。消息本身是持久的(或不持久的)。有关更多信息,请参阅我关于该主题的博客文章。这是一个相当重要的话题,因为当人们假设队列本身是持久的时,他们倾向于设计产生意想不到的结果的解决方案。请阅读博文!

于 2012-09-17T14:46:10.417 回答