0

我在从 Websphere MQ 获取消息时遇到了问题。

我们有一个在 spring TC 服务器中运行的应用程序。应用程序正在使用 spring 集成器 JMS 适配器从 Websphere MQ 服务器接收消息。以下是我们使用的弹簧配置。

我们面临的问题是,有时即使 websphere mq 启动并运行并且应用程序启动并运行,应用程序也无法获取消息,因此消息落入 websphere mq 死信队列

上述情况有没有可能?我们无法重现这种情况

<beans:bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
        <beans:property name="transportType">
            <util:constant static-field="com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP" />
        </beans:property>
        <beans:property name="queueManager" value="queueManager" />
        <beans:property name="hostName" value="hostName" />
        <beans:property name="channel" value="channel" />
        <beans:property name="port" value="port" />
        <beans:property name="clientReconnectOptions">
            <util:constant static-field="com.ibm.msg.client.wmq.WMQConstants.WMQ_CLIENT_RECONNECT"/>
        </beans:property>
    </beans:bean>

    <beans:bean id="mqSeriesConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
         <beans:property name="username" value="username"/> 
         <beans:property name="password" value="password"/> 
         <beans:property name="targetConnectionFactory" ref="connectionFactory"/>
    </beans:bean>

    <beans:bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <beans:property name="connectionFactory" ref="mqSeriesConnectionFactory" />
    </beans:bean>

    <beans:bean id="mqQueueG3Receive" class="com.ibm.mq.jms.MQQueue">
        <beans:constructor-arg value="receivequeue" />
        <beans:property name="targetClient" value="1"/>
    </beans:bean>

    <beans:bean id="mqQueueG3Send" class="com.ibm.mq.jms.MQQueue">
        <beans:constructor-arg value="sendqueue" />
        <beans:property name="targetClient" value="1"/>
    </beans:bean>

    <jms:message-driven-channel-adapter id="MessageManagerJmsAdapter"
        connection-factory="mqSeriesConnectionFactory"
        destination="mqQueueG3Send"
        concurrent-consumers="7"
        max-concurrent-consumers="40"
        transaction-manager="jmsTransactionManager" 
        message-converter="resultMessageConverter"
        channel="MessageManagerIncomingChannel" />

    <channel id="g3MessageManagerIncomingChannel" />

    <service-activator id="MessageManagerActivator" 
        input-channel="MessageManagerIncomingChannel"
        ref="MessageManager" 
        method="manageMessage" />

谢谢

4

2 回答 2

0

如果他们要去 DLQ,则意味着交付失败,而不是应用程序无法“获取消息”。我希望会记录一个错误。

要查找的另一件事是容器的线程 (7) 是否在您的 MessageManager bean 中的某处被阻塞。进行线程转储(jstack 或 visualVM)以了解容器线程在做什么。

最后,跟踪日志将在空闲时显示容器线程活动。

于 2013-08-01T11:02:49.067 回答
0

谈到 Spring Integration JMS,WebSphere MQ 有点挑剔。而不是建立message-driven-channel-adapter连接设置,您可能想尝试配置自己的DefaultMessageListenerContainer并使用它。需要注意的事项包括;

  • sessionTransacted = true
  • 事务管理器 = [参考]

所以这看起来像;

<int-jms:message-driven-channel-adapter channel="myChannel" container="myContainer"/>

<bean id="myContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="myConnectionFactory"/>
  <property name="destination" ref="myQueue"/>
  <property name="sessionTransacted" value="true"/>
  <property name="transactionManager" ref="myTransactionManager"/>
</bean>
于 2013-08-01T11:04:28.743 回答