【问题标题】:Spring Integration IBM MQ JMS clientSpring 集成 IBM MQ JMS 客户端
【发布时间】:2017-03-29 04:17:02
【问题描述】:

我已经编写了代码来使用 Spring Integration JMS-message-driven-channel-adapter 从 IBM MQ 发送/读取消息,但无法解析 JMS 文本响应消息...下面是我的集成 xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:int="http://www.springframework.org/schema/integration"
        xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/integration
            http://www.springframework.org/schema/integration/spring-integration.xsd
            http://www.springframework.org/schema/integration/jms
            http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd">

        <context:annotation-config />
        <context:component-scan base-package="com.*****" />

        <!-- Factory Defintions -->
        <bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="transportType" value="1" />
            <property name="queueManager" value="****" />
            <property name="hostName" value="******" />
            <property name="port" value="****" />
            <property name="channel" value="******" />
        </bean>

        <!-- Queue Definition -->
        <bean id="inQueue" class="com.ibm.mq.jms.MQQueue" depends-on="connectionFactory">
            <constructor-arg index="0" value="****" />
            <constructor-arg index="1" value="*****" />
        </bean>

        <bean id="outQueue" class="com.ibm.mq.jms.MQQueue" depends-on="connectionFactory">
            <constructor-arg index="0" value="*****" />
            <constructor-arg index="1" value="******" />
        </bean>

        <bean id="messageListener" class="com.***.MessageListener"/>
        <bean id="messagePublisher" class="com.*****.MessagePublisher"/>

        <!-- OUTBOUND settings -->

        <int:channel id="senderChannel" />

        <int-jms:outbound-channel-adapter id="jmsOut" destination="outQueue" channel="senderChannel"/>

       <!--  <int:service-activator output-channel="senderChannel" ref="messagePublisher" method="processMessage" /> -->

        <!-- INBOUND settings -->

        <int:channel id="recieverChannel" />    

        <int-jms:message-driven-channel-adapter id="jmsIn" destination="inQueue" channel="recieverChannel" extract-payload="false" />

        <int:service-activator input-channel="recieverChannel" ref="messageListener" method="processMessage" />

    </beans>

该进程打算通过 MQ 向外部服务器发送一条消息,它们可能(或可能不响应)一个 ack。

发布者代码:

import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.integration.support.MessageBuilder;
    import org.springframework.messaging.MessageChannel;

    public class MessagePublisher {

        @Autowired
        private MessageChannel senderChannel;

        public void processMessage(String message) {
            System.out.println("MessagePublisher::::::Sent message: " + message);

            senderChannel.send(MessageBuilder.withPayload(message).build());
        }
    }

目前在我的听众中,我尝试将 ack 打印为:

    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.TextMessage;

    public class MessageListener {

        public void processMessage(Message message) {

            if (message instanceof TextMessage) {
                TextMessage txtmsg = (TextMessage) message;

                try {

                    System.out.println("MessageListener::::::Received message: "
                            + txtmsg.getText());
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

问题是当我收到消息时,正文包含编码字符串:

MessageListener::::::Received message: [在此处打印编码的特殊字符]

如何以正确的格式解析完整的响应文本?我检查了响应对象的实例似乎只是 JMS 文本消息,但是在控制台上打印时我只看到编码的字符串消息。

【问题讨论】:

  • 我们不知道编码算法,因此无法帮助您从 void 解析。请提供有关该消息内容的更多信息。
  • 消息只是发送到外部 JMS 服务器的“测试消息”。收到的 ack 包含 JMS 标头和正文。我可以很好地阅读标头,但似乎正文已加密,因为它都是特殊字符,所以我不能将它们粘贴在这里(它看起来更像是一个字节消息) 但我无法仅通过查看响应来确认其特殊的 IBm 编码。
  • 所以,只需询问“外部服务器”他们发送给您的内容!不确定您在这里寻求什么帮助,因为该问题与任何工具的使用无关。这只是一个正在处理的业务任务和数据格式。
  • 我们有另一个使用基本 MQ 实现(不是基于 Spring)运行的应用程序。所以我们知道他们在该消息响应中向我们发送“成功”或“错误”。我觉得我在阅读消息时缺少指定编码的地方,但无法弄清楚。无论如何感谢您的帮助,如果您在从频道阅读消息时发现我做错了什么,请告诉我。

标签: spring spring-integration


【解决方案1】:

好的。我认为您的问题确实出在character encoding 上,发送方和接收方不同:

试试这个:

byte[] by = ((TextMessage) msg).getText().getBytes("ISO-8859-1");
String text = new String(by,"UTF-8");

更多信息在这里:Encoding a JMS TextMessagehere

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2022-11-08
    • 2020-09-29
    • 2021-09-27
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多