【问题标题】:camel jms not getting messages from IBM MQ骆驼 jms 没有从 IBM MQ 获取消息
【发布时间】:2017-05-05 03:50:06
【问题描述】:

我有几个骆驼微服务作为单独的战争文件部署到 tomcat。每个战争文件都包含一个独特的骆驼路线。其中一项服务接受soap 请求并将消息放入IBM MQ 上的队列中。这没有问题。获取这些消息的服务似乎不会将消息从队列中拉出并转发它们。每个 war 文件都有以下作为其 IBM MQ 配置

   <!-- Configure IBM MQ connection factory -->
    <bean id="ibmMqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
        <property name="transportType" value="1"/>
        <property name="hostName"      value="${ibm.mq.host}"/>
        <property name="port"          value="${ibm.mq.port}"/>
        <property name="channel"       value="${ibm.mq.channel}"/>
        <property name="queueManager"  value="${ibm.qm.name}"/>
    </bean>

    <bean id="ibmMqPooledConnectionFactory" class="org.apache.activemq.jms.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
        <property name="connectionFactory"                 ref="ibmMqConnectionFactory"/>
        <property name="maxConnections"                    value="8"/>
        <property name="maximumActiveSessionPerConnection" value="1"/>
        <property name="expiryTimeout"                     value="30000"/>
        <property name="idleTimeout"                       value="30000"/>
        <property name="blockIfSessionPoolIsFull"          value="false"/>
    </bean>

    <bean id="ibmMqConnectionFactorySecured" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
        <property name="targetConnectionFactory" ref="ibmMqPooledConnectionFactory"/>
        <property name="username"                value="${ibm.mq.username}"/>
        <property name="password"                value="${ibm.mq.password}"/>
    </bean>

    <bean id="ibmMqTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="ibmMqConnectionFactorySecured" />
    </bean>

    <bean id="ibmMqJmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory"   ref="ibmMqConnectionFactorySecured"/>
        <property name="concurrentConsumers" value="4"/>
        <property name="transacted"          value="true"/>
        <property name="transactionManager"  ref="ibmMqTransactionManager" />
        <property name="cacheLevelName"      value="CACHE_NONE" />
    </bean>

    <bean id="ibmMq" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="ibmMqJmsConfig"/>
    </bean>

从队列中提取消息的骆驼路线之一的示例如下所示

<route id="cancellation-service-route" errorHandlerRef="deadLetterErrorHandler">
    <from uri="{{cancellationService.queue}}"/>
    <unmarshal ref="requestCancellationRequest"/>
    <to uri="bean:cancellationTranslator?method=transform"/>
    ...
</route>

路由启动,但不会将消息拉出队列。

【问题讨论】:

  • 我发现放入队列的消息被截断了。这会导致监听器失败。我不知道为什么消息被截断。使用 ActiveMQ 时效果很好。
  • maximumActiveSessionPerConnection=1 似乎很低。您可以尝试更高的值,例如 20 吗?关于被截断的消息:我记得一些 WMQ 工具只将消息显示为被截断。这可能会产生误导。
  • 谢谢塞巴斯蒂安。在将消息发送到队列之前,我通过执行 解决了截断问题。我怀疑这是因为该消息是 UTF-8 编码的 xml 消息。奇怪的是我在使用 ActiveMQ 时不必这样做

标签: apache-camel ibm-mq


【解决方案1】:

在将消息发送到队列之前,我通过执行&lt;convertBodyTo type="String" /> 解决了截断问题。我怀疑这是因为该消息是 UTF-8 编码的 xml 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多