即使应用程序和websphere mq启动并运行,有时也无法从Websphere MQ获取消息

时间:2013-08-01 08:30:42

标签: spring ibm-mq spring-integration spring-jms

我在从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" />

由于

2 个答案:

答案 0 :(得分:0)

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

要查找的另一件事是,如果容器的线程(7)在MessageManager bean中的某处被阻塞。采用线程转储(jstack或visualVM)来找出容器线程正在做什么。

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

答案 1 :(得分:0)

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

  • sessionTransacted = true
  • transactionManager = [ref]

所以这看起来像;

<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>