websphere MQ 编程指南(Java)

来源:互联网 发布:英雄联盟 魔兽世界知乎 编辑:程序博客网 时间:2024/05/16 10:09

转载:http://blog.csdn.net/xfworld/article/details/16113415

接触websphere MQ 已经两年了,现在才搞明白有两种读取数据的方式,感觉狠汗颜。压根都没想着去了解一下,这次彻底的去查阅了一下官方的资料,本文除了介绍对应的读取方式也会提供关键性的代码,给予参考。

  • 第一种格式:破坏性读取
从队列中直接获取信息,队列深度减少,信息自动清除。
[java] view plaincopy
  1. <span style="font-family:Microsoft YaHei;">int openOptions = MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE;  
  2.         // 打开队列  
  3.         try {  
  4.             mQueue = qMgr.accessQueue(this.queuename,openOptions);  
  5.             logger.info("访问队列"+this.queuename);  
  6.         } catch (MQException exp) {  
  7.             logger.error(this.queuename+"队列访问失败",exp);  
  8.         }                               </span>  

  • 第二种格式:浏览性读取

    采用浏览指针的方式获取队列中的信息,队列深度不减少,信息保留。

[java] view plaincopy
  1. <span style="font-family:Microsoft YaHei;">//浏览消息  
  2.         int openOptions =  MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_BROWSE;  
  3.         // 打开队列  
  4.         try {  
  5.             mQueue = qMgr.accessQueue(this.queuename,openOptions);  
  6.             logger.info("访问队列"+this.queuename);  
  7.         } catch (MQException exp) {  
  8.             logger.error(this.queuename+"队列访问失败",exp);  
  9.         }   </span>  

以上主要区别在队列AccessQueue的参数上,参数的详解:

MQC.MQOO_FAIL_IF_QUIESCING     
 IBM官方的文档描述:Fail if the queue manager is quiescing.

MQC.MQOO_BROWSE   
IBM官方的文档描述:Open to browse message.

MQC.MQOO_INPUT_AS_Q_DEF       
IBM官方的文档描述:Open to get messages using queue-defined default.

MQC.MQOO_OUTPUT
IBM官方的文档描述:Open to put messages.

MQC.MQOO_INQUIRE
IBM官方的文档描述:Open for inquiry - required if you want to query properties


以上参数中MQC.MQOO_INQUIRE和读取队列的深度有关系,如果你要用到队列深度的话,必须采用这个参数。

以下是队列数据读取信息的代码:
 
  • 破坏性读取
[java] view plaincopy
  1. try {  
  2.               
  3.             int depth = this.getQueueDepth();  
  4.             //将队列的里的消息读出来  
  5.             if(depth>0)  
  6.             {  
  7.                 MQMessage msg = new MQMessage();// 要读的队列的消息  
  8.                 MQGetMessageOptions gmo = new MQGetMessageOptions();  
  9.                 mQueue.get(msg, gmo);  
  10.                 logger.info("消息的大小为:"+msg.getDataLength());  
  11.                 System.out.println("---------------------------");  
  12.                 str=new byte[msg.getDataLength()];  
  13.                 msg.readFully(str);  
  14.                 msg.clearMessage();}  
  15.             }   
  16.             catch (MQException e)  
  17.              {  
  18.                 logger.error(e);} catch (Exception e) {logger.error(e);}  
[html] view plaincopy
  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  

以上参数byte[] str将会是最终的结果,将会以二进制的方式存储。
getQueueDepth()这个方式是获取当前队列的深度,实际上是调用mQueue.getCurrentDepth()
有多少条消息可以根据队列的深度来确定
  • 浏览性读取
[java] view plaincopy
  1. <span style="font-family:Microsoft YaHei;"><span style="white-space:pre">   </span>boolean firstBrowsed = false;  
  2.     boolean isContinue = true;  
  3.          while (isContinue)  
  4.          {  
  5.              MQMessage mqMsg; // MQMessage instance  
  6.              MQGetMessageOptions mqGetMsgOpts; // MQGetMessageOptions instance  
  7.   
  8.              mqMsg = new MQMessage();  
  9.              mqGetMsgOpts = new MQGetMessageOptions();  
  10.              //mqGetMsgOpts.waitInterval = 15000; // 15 second limit for waiting  
  11.              if (!firstBrowsed)  
  12.              {  
  13.                  mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_FIRST;  
  14.   
  15.              }  
  16.              else  
  17.              {  
  18.                  mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_NEXT;  
  19.              }  
  20.              try  
  21.              {  
  22.                  mQueue.get(mqMsg, mqGetMsgOpts);  
  23.                  firstBrowsed = true;  
  24.                  if (mqMsg.getMessageLength() > 0)  
  25.                  {  
  26. <span style="white-space:pre">      </span>    String str=mqMsg.readString(mqMsg.getMessageLength()));  
  27.                  }  
  28.                
  29.              }  
  30.              catch (MQException mqe)  
  31.              {  
  32.                 if (mqe.reasonCode != MQException.MQRC_NO_MSG_AVAILABLE)  
  33.                 {  
  34.                     try  
  35.                     {  
  36.                         qMgr.backout();  
  37.                     }  
  38.                     catch (MQException e)  
  39.                     {  
  40.                         // TODO Auto-generated catch block  
  41.                         //logger.error(e);  
  42.                     }  
  43.                 }  
  44.                 else  
  45.                 {  
  46.                     isContinue = false;  
  47.                 }  
  48.              }  
  49.         catch (Exception e)  
  50.         {  
  51.         // TODO Auto-generated catch block  
  52.         logger.error(interfacename+"没有消息到达!");  
  53.         }  
  54.        }</span>  
浏览消息就感觉是和链表(linkList)一样的原理,获取到队列的头后,采用link的方式获取下一条消息,一直到消息为空。
以上是参考代码中str将会以String的类型返回。这种读取的方式会直接过滤掉文件头,
如果需要做文件头分析,就要参考破坏性读取的代码,对接收这块重新修改。

以上详细描述了MQ对队列的读取的两种方式,希望对所有的MQ操作者有所帮助。
另外推荐一篇IBM官方的文档: 
为中小型企业定制websphere MQ v7,这篇文档中基本就介绍了MQ使用的基本环境和要求,
以及实施和解决方案,以及监控方式。
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1106_arora/1106_arora.html
另外一片是关于优化MQ使用的:
在 Windows 和 UNIX 上配置和优化 WebSphere MQ 性能
这篇文档介绍了优化MQ的配置方式,非常详细推荐。
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0712_dunn/0712_dunn.html
0 0