【问题标题】:MQ channel closing by java codejava代码关闭MQ通道
【发布时间】:2018-07-10 00:30:29
【问题描述】:

我是 MQ 编程新手。根据我的要求,我正在尝试将示例 XML 消息放入队列中,并期望从响应队列中返回响应。 我可以看到关联的通道打开了很短的时间,持续了几秒钟,然后关闭了。请在下面找到我用来将消息放入队列的代码。请求您提供宝贵意见以解决此问题。

错误:

Process(12908.13579) User(abc) Program(amqrmppa)
                    Host(hostname)
AMQ9208: Error on receive from host 10 (10.0.0.1). 
EXPLANATION:
An error occurred receiving data from 10 (10.0.0.1) over TCP/IP. This may
be due to a communications failure.

使用的代码:

package com.company.mq;


import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;

import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

public class MQConnection {

                private static final String CORR_ID = "CORRELID";
                String qMgrStr = "";
                String hostName = "hostname";
                String password ="xxxx"; 
                String userName ="username";   
                String putqueueName = "putqueuename";
                String getqueuename = "getqueuename ";
                String channel = "channel";
                String replyToQueue = "replyToQueue";
                String replyToQueueManager = "";

                static String content = ""; 


                int port =10000;

                MQQueue readQueue = null;
                MQQueue writeQueue = null;
                MQQueueManager qManager;


                @SuppressWarnings("unchecked")
                public void init(){                              
                                MQEnvironment.hostname =hostName;
                                MQEnvironment.channel = channel;
                                MQEnvironment.port = port;
                                MQEnvironment.userID = userName;
                                MQEnvironment.password = password;
                                MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);

                                try {
                                                qManager = new MQQueueManager("");
                                                System.out.println("qManager====>"+qManager);
                                }catch(Exception e){
                                                e.printStackTrace();
                                }
                                try {
                                                System.out.println("qManager==> hhh"+qManager);
                                } catch (Exception e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                }
                }

                public String putAndGetMessage() throws InterruptedException, IOException{

                                int openOptions = MQC.MQOO_OUTPUT | MQC.MQPMO_SET_ALL_CONTEXT | MQC.MQOO_FAIL_IF_QUIESCING;
                                String msgString = content.toString();
                                System.out.println("msgString=="+msgString);
                                int expiryTime =60000;
                                MQMessage getmessage = null;
                                int waitInterval =4000;
                                try {
                                                System.out.println("qManager Desc==>"+qManager.getDescription());
                                                writeQueue =openWriteQueue(qManager,putqueueName);

                                                MQMessage message = myPut(writeQueue,msgString,expiryTime,getqueuename);

//                                                qManager.accessQueue(putqueueName, openOptions,null,null,null);

                                                readQueue =openReadQueue(qManager,getqueuename);

                                                getmessage =mqGet(readQueue,waitInterval,message.messageId);


                                                /*MQMessage msg = new MQMessage();
                                                msg.messageType = MQC.MQMT_REQUEST;
                                                msg.format = "MQSTR";
                                                // msg.characterSet = 500;
                                                msg.persistence = MQC.MQPER_NOT_PERSISTENT;
                                                msg.correlationId = CORR_ID.getBytes();
                                                // msg.messageId = CORR_ID.getBytes();
                                                msg.expiry= 10000;*/

                                                /*System.out.println("before");
                                                Thread.sleep(10000);
                                                System.out.println("after");*/

                                                /*MQGetMessageOptions gmo = new MQGetMessageOptions();
                                                int openOptions1 = MQC.MQGMO_WAIT| MQC.MQGMO_CONVERT| MQC.MQGMO_FAIL_IF_QUIESCING;
                                                System.out.println("in getqManager==>"+qManager);
                                                readQueue = qManager.accessQueue(getqueuename, openOptions1);
                                                System.out.println("deafaultQueue======>"+readQueue);
                                                readQueue.get(getmessage,gmo);
                                                System.out.println(getmessage.readInt());

                                                String retriveMsg = getmessage.readUTF();
                                                System.out.println("read===>"+retriveMsg);*/

                                } catch(MQException e){
                                                e.printStackTrace();
                                }
                                return getmessage.readString(getmessage.getMessageLength());


                }


                private MQMessage mqGet(MQQueue readQueue2, int waitInterval,
                                                byte[] corrID) throws MQException {
                                MQMessage responseMessage = new MQMessage();
                                responseMessage.correlationId =corrID;

                                MQGetMessageOptions gmo = new MQGetMessageOptions();
                                gmo.options =MQC.MQGMO_WAIT| MQC.MQGMO_CONVERT| MQC.MQGMO_FAIL_IF_QUIESCING;
                                gmo.matchOptions = MQC.MQMO_MATCH_CORREL_ID;
                                gmo.waitInterval = waitInterval;
                                // TODO Auto-generated method stub
                                readQueue2.get(responseMessage,gmo);
                                return responseMessage;
                }

                private MQQueue openReadQueue(MQQueueManager manager, String getqueuename2) throws MQException {
                                // TODO Auto-generated method stub
                                return openQueue(manager,getqueuename2,MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE |MQC.MQOO_FAIL_IF_QUIESCING);
                }

                private MQMessage myPut(MQQueue writeQueue2, String msgString,
                                                int expiryTime, String getqueuename2) {
                                // TODO Auto-generated method stub

                                MQPutMessageOptions mpo =new MQPutMessageOptions();
                                mpo.options = MQC.MQPMO_NEW_MSG_ID | MQC.MQMO_MATCH_CORREL_ID;

                                MQMessage putmessage = new MQMessage();
                                putmessage.format = MQC.MQFMT_STRING;
                                putmessage.messageFlags = MQC.MQMT_REQUEST;
                                putmessage.replyToQueueName =replyToQueue;
                                putmessage.replyToQueueManagerName = qMgrStr;
                                putmessage.userId="userId";
                                putmessage.expiry =expiryTime;
                                try {
                                                putmessage.write(msgString.getBytes());
                                                try {
                                                                writeQueue2.put(putmessage,mpo);
                                                } catch (MQException e) {
                                                                // TODO Auto-generated catch block
                                                                e.printStackTrace();
                                                }
                                } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                }

                                return putmessage;
                }

                private MQQueue openWriteQueue(MQQueueManager manager, String queueName) throws MQException{
                                // TODO Auto-generated method stub
                                return openQueue(manager,queueName,MQC.MQOO_OUTPUT | MQC.MQPMO_SET_ALL_CONTEXT | MQC.MQOO_FAIL_IF_QUIESCING);
                }

                private MQQueue openQueue(MQQueueManager manager, String queueName, int options)  throws MQException{
                                // TODO Auto-generated method stub
                                return manager.accessQueue(queueName, options,null,null,null);
                }

                /**
                * @param args
                * @throws IOException 
                 * @throws InterruptedException 
                 */
                public static void main(String[] args) throws IOException, InterruptedException {
                                // TODO Auto-generated method stub

                                MQConnection conn = new MQConnection();

                                DataInputStream dis =    new DataInputStream ( new FileInputStream ("c://request//Request.xml"));

                                 byte[] datainBytes = new byte[dis.available()];
                                dis.readFully(datainBytes);
                                dis.close();

                                content = new String(datainBytes, 0, datainBytes.length);
                                //System.out.println("content===>"+content);

                                conn.init();
                                System.out.println("connected");
                                conn.putAndGetMessage();

                }

}

【问题讨论】:

  • 你没有提到你正在使用哪个版本。您是否从应用程序中收到错误消息?我希望会引发某种异常......
  • 错误中是否指定了 MQ 原因代码?我猜您问题中的错误消息来自队列管理器错误日志。如果是这样,这是完整的错误消息吗,因为它似乎比平时短了很多?

标签: java ibm-mq


【解决方案1】:

应用程序似乎是一个封装 MQ I/O 的类。在实例化时,init 例程构造类并尝试连接到队列管理器。我可以看到代码存在一些问题。另外,我怀疑我知道代码失败的原因,但问题中没有提供诊断信息,所以我只能猜测。我将首先描述问题,然后描述我通常期望的诊断信息。

代码问题
该代码提供了用户 ID 和密码。除非这是与 v8.0 队列管理器对话的 v8.0 客户端,或者是使用出口通过 TLS 通道与 MQ 对话的客户端,否则不会检查并且不需要密码。更糟糕的是,如果通道不是 TLS 和加密的,则 ID 和密码将通过网络以明文形式传输。把密码拿出来。仅当应用提供的 ID 需要在连接请求中被覆盖时才使用该 ID。

代码没有打印链接的异常。 JMS 异常是一种多级数据结构,其中顶级是 JMS 理解的异常,而较低级别的异常是传输提供者理解的异常。许多传输提供者,尤其是那些用纯 Java 编写的,只使用数据结构的顶层并且不提供链接异常。但是,作为开发人员,您不能假设永远不会发生这种情况。

JMS 开发人员没有正当理由无法打印链接的异常

当我在一家大型银行管理 MQ 管理团队时,我的政策是,如果它不遵循这些规则,就不会进入生产环境:

  1. 遇到 JMS 异常时,代码必须打印链接的异常。
  2. 如果没有链接到 JMS 异常的异常,代码必须打印字符串“未找到链接的异常”,以便我们知道它至少看起来一个。

代码使用MQC.MQPMO_SET_ALL_CONTEXT 选项打开队列。此级别的权限通常不会授予非管理员用户。该代码明确指定了一个 ID,表明它没有以管理员权限运行。由于这些原因,我怀疑您遇到了 2035 错误,您当然看不到,因为代码无法打印链接的异常。

缺少诊断
MQ 的行为因版本而异。多年来,Java/JMS 类已被重新打包、重构并升级到 JMS 1.1,然后升级到 JMS 2.0。诊断问题,无论是在此处发布还是发送给您的 MQ 管理员以用于生产中断,都应指明正在使用的 MQ 客户端和 MQ 服务器的版本。客户端节点和服务器节点上dspmqver -a 的输出总是有帮助的。

如前所述,链接的异常没有被打印。没有它,堆栈跟踪可能一文不值,所以这一次我没有感到失望没有提供堆栈跟踪。但是,请更新代码以打印链接的异常并在将来包含堆栈跟踪。

客户端和服务器都会产生错误日志。除了队列管理器的错误日志之外,服务器上还有全局错误日志,用于记录在识别队列管理器之前发生的事情或在全局 MQ 配置上运行的命令。在这种情况下,没有提供来自任何这些来源的错误日志信息。为什么不呢?

服务器也产生事件消息。这些通常由监控代理使用,但可能由管理员启用并查看以确定问题。在没有错误日志消息的情况下,事件消息可能非常有用。在这种情况下,我不希望它们出现,但为了完整起见,在此提及。

FDC 文件由队列管理器生成并存储在与全局错误日志相同的目录中。这些提供了比错误日志条目更详细的信息,但并不总是产生。通常,问题诊断请求会提及没有生成 FDC 文件,或者它们是并提供来自它们的头块。

资源
请看:

  • MQ Knowledge Center,如果您还没有找到的话。
  • 尤其是troubleshooting 部分,
  • linked exceptions 部分。 (虽然这些不是 MQ 特有的,但 IBM 至少提供了一些示例代码,您可以复制和粘贴。确保粘贴为纯文本并更正任何花引号。)
  • MQ SupportPacs 页面,
  • ...特别是 MS0T 是最新的 MQ Explorer(与后级 QMgrs 一起使用),MS0P 是一组插件,允许 Explorer 解析事件消息等.
  • IBM 的 MQDev 社区。虽然这对于查找文章和参考资料非常有用,但论坛却很一般。
  • 对于社区,我更喜欢Vienna MQ list serverMQSeries.net 的论坛。两者都是由开发人员、管理员和 IBM 员工组成的蓬勃发展的社区。​​li>
  • 当然,请继续在 标签中发帖。上述两个社区都没有完善的 MQ 常见问题解答,而 Stack Overflow 提供了该功能。有几位 MQ 老前辈和 IBM 员工正在策划 Stack Overflow MQ 标签。
  • 如果您可以管理资金和旅行,请参加MQ Tech Conference。 IBM 曾经举办过 Transaction and Messaging 会议,但将这些会议与 WebSphere 的其他部分结合起来形成了 IMPACT。去年,它将包括 IMPACT 在内的多个会议合并为互连。 MQ Tech 会议全是 MQ,整个星期,而且非常便宜。由于 IBM 将他们的 MQ 课程和培训外包,因此课堂培训不太可行,而且会议涵盖了课堂培训中没有的材料。

坚持下去,祝你好运!

全面披露:我是 MQ 技术会议的创始人之一,我的 MQ 咨询公司是赞助商。然而,它在去年第一天的 MQ 会话数几乎与 Interconnect 整个星期的次数一样所以我认为推荐它没有利益冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-03-24
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多