Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1661646
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: 网络与安全

2016-08-05 10:30:15

按照上一篇 http://blog.chinaunix.net/uid-28811518-id-5749060.html 搭建两个队列管理器和三个队列
前提是这个环境下两个队列管理器之间已经可以远程发送和接收消息;现在想通过java程序访问队列管理器,进而实现java应用程序之间的远程通信:
1、首先要注意的是设置的环境端口问题,在win界面下可以通过,队列管理器下的监听器查看本队列管理器监听的端口号,在java 程序访问队列管理器的时候端口号一定设置正确。
2、MQEnvironment.channel="SYSTEM.DEF.SVRCONN"; 这个是服务器连接的通道,具体我也弄清楚,不过应该是默认的访问通道,不用自己创建
3、MQEnvironment.CCSID=1381;                      //服务器MQ服务使用的编码1381代表GBK
4、最后要注意的也是最终要的一点,否则java程序访问不成功,返回2035没有访问权限
我采用的是关闭通道认证的功能,这是最坏的解决办法,但是为了先调通也只有先这么做了,以后再去查看其它解决办法。a、启动队列管理器后;b、ALTER QMGR CHLAUTH(DISABLED)关闭通道认证功能
其它办法参考:blog.csdn.net/haitaofeiyang/article/details/46897323
下面是具体的发送和接收端的代码(代码是在网上找的,自己修改了下,现在可以实现通信)
发送端代码:

点击(此处)折叠或打开

  1. import java.io.IOException;
  2. import com.ibm.mq.MQC;
  3. import com.ibm.mq.MQEnvironment;
  4. import com.ibm.mq.MQException;
  5. import com.ibm.mq.MQGetMessageOptions;
  6. import com.ibm.mq.MQMessage;
  7. import com.ibm.mq.MQPutMessageOptions;
  8. import com.ibm.mq.MQQueue;
  9. import com.ibm.mq.MQQueueManager;

  10. public class MQ_Send{
  11.      //定义队列管理器和队列的名称
  12.      private static String qmName;
  13.      private static String qName;
  14.      private static MQQueueManager qMgr;
  15.      static{
  16.          //设置环境:
  17.          //MQEnvironment中包含控制MQQueueManager对象中的环境的构成的静态变量,MQEnvironment的值的设定会在MQQueueManager的构造函数加载的时候起作用,
  18.          //因此必须在建立MQQueueManager对象之前设定MQEnvironment中的值.
  19.          MQEnvironment.hostname="192.168.223.129";     //MQ服务器的IP地址
  20.          MQEnvironment.channel="SYSTEM.DEF.SVRCONN";             //服务器连接的通道
  21.          MQEnvironment.CCSID=1381;         //服务器MQ服务使用的编码1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID)
  22.          MQEnvironment.port=1415;                        //MQ端口
  23.          qmName = "QM_ORANGE";                            //MQ的队列管理器名称
  24.          qName = "Q1";                                //MQ远程队列的名称
  25.          try {
  26.              //定义并初始化队列管理器对象并连接
  27.           //MQQueueManager可以被多线程共享,但是从MQ获取信息的时候是同步的,任何时候只有一个线程可以和MQ通信。
  28.             qMgr = new MQQueueManager(qmName);
  29.         } catch (MQException e) {
  30.             // TODO Auto-generated catch block
  31.             System.out.println("初使化MQ出错");
  32.             e.printStackTrace();
  33.         }
  34.      }
  35.      /**
  36.       * 往MQ发送消息
  37.       * @param message
  38.       * @return
  39.       */
  40.      public static int sendMessage(String message){
  41.          int result=0;
  42.          try{    
  43.              //设置将要连接的队列属性
  44.          // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface
  45.          //(except for completion code constants and error code constants).
  46.          //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.
  47.          //MQOO_OUTPUT:Open the queue to put messages.
  48.              /*目标为远程队列,所有这里不可以用MQOO_INPUT_AS_Q_DEF属性*/
  49.              //int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
  50.              /*以下选项可适合远程队列与本地队列*/
  51.              int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
  52.      //连接队列
  53.      //MQQueue provides inquire, set, put and get operations for WebSphere MQ queues.
  54.      //The inquire and set capabilities are inherited from MQManagedObject.
  55.              /*关闭了就重新打开*/
  56.              if(qMgr==null || !qMgr.isConnected()){
  57.                  qMgr = new MQQueueManager(qmName);
  58.              }
  59.      MQQueue queue = qMgr.accessQueue(qName, openOptions);     
  60.      //定义一个简单的消息
  61.      MQMessage putMessage = new MQMessage();
  62.      //将数据放入消息缓冲区
  63.      putMessage.writeUTF(message);    
  64.      //设置写入消息的属性(默认属性)
  65.      MQPutMessageOptions pmo = new MQPutMessageOptions();    
  66.      //将消息写入队列
  67.      queue.put(putMessage,pmo);
  68.      queue.close();
  69.          }catch (MQException ex) {
  70.              System.out.println("A WebSphere MQ error occurred : Completion code "
  71.              + ex.completionCode + " Reason code " + ex.reasonCode);
  72.              ex.printStackTrace();
  73.          }catch (IOException ex) {
  74.              System.out.println("An error occurred whilst writing to the message buffer: " + ex);
  75.          }catch(Exception ex){
  76.              ex.printStackTrace();
  77.          }finally{
  78.              try {
  79.                  qMgr.disconnect();
  80.              } catch (MQException e) {
  81.                  e.printStackTrace();
  82.              }
  83.           }
  84.          return result;
  85.      }
  86.  public static void main(String args[]) {
  87.          /*下面两个方法可同时使用,也可以单独使用*/
  88.          sendMessage("this is a test");
  89.         
  90.      }
  91. }
接收端代码:

点击(此处)折叠或打开

  1. import java.io.IOException;
  2. import com.ibm.mq.MQC;
  3. import com.ibm.mq.MQEnvironment;
  4. import com.ibm.mq.MQException;
  5. import com.ibm.mq.MQGetMessageOptions;
  6. import com.ibm.mq.MQMessage;
  7. import com.ibm.mq.MQPutMessageOptions;
  8. import com.ibm.mq.MQQueue;
  9. import com.ibm.mq.MQQueueManager;

  10. public class MQ_Recive{
  11.      //定义队列管理器和队列的名称
  12.      private static String qmName;
  13.      private static String qName;
  14.      private static MQQueueManager qMgr;
  15.      static{
  16.          //设置环境:
  17.          //MQEnvironment中包含控制MQQueueManager对象中的环境的构成的静态变量,MQEnvironment的值的设定会在MQQueueManager的构造函数加载的时候起作用,
  18.          //因此必须在建立MQQueueManager对象之前设定MQEnvironment中的值.
  19.          MQEnvironment.hostname="192.168.223.129";     //MQ服务器的IP地址
  20.          MQEnvironment.channel="SYSTEM.DEF.SVRCONN";             //服务器连接的通道,这个通道是默认有的不用创建
  21.          MQEnvironment.CCSID=1381;         //服务器MQ服务使用的编码1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID)
  22.          MQEnvironment.port=1416;                        //MQ端口
  23.          qmName = "QM_APPLE";                            //MQ的队列管理器名称
  24.          qName = "Q1";                                //MQ远程队列的名称
  25.          try {
  26.              //定义并初始化队列管理器对象并连接
  27.           //MQQueueManager可以被多线程共享,但是从MQ获取信息的时候是同步的,任何时候只有一个线程可以和MQ通信。
  28.             qMgr = new MQQueueManager(qmName);
  29.         } catch (MQException e) {
  30.             // TODO Auto-generated catch block
  31.             System.out.println("初使化MQ出错");
  32.             e.printStackTrace();
  33.         }
  34.      }
  35.      public static String getMessage(){
  36.          String message=null;
  37.          try{         
  38.              //设置将要连接的队列属性
  39.          // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface
  40.          //(except for completion code constants and error code constants).
  41.          //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.
  42.          //MQOO_OUTPUT:Open the queue to put messages.
  43.              int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
  44.           MQMessage retrieve = new MQMessage();
  45.           //设置取出消息的属性(默认属性)
  46.           //Set the put message options.(设置放置消息选项)
  47.              MQGetMessageOptions gmo = new MQGetMessageOptions();
  48.              gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;//Get messages under sync point control(在同步点控制下获取消息)
  49.              gmo.options = gmo.options + MQC.MQGMO_WAIT; // Wait if no messages on the Queue(如果在队列上没有消息则等待)
  50.              gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;// Fail if Qeue Manager Quiescing(如果队列管理器停顿则失败)
  51.              gmo.waitInterval = 1000 ; // Sets the time limit for the wait.(设置等待的毫秒时间限制)
  52.              /*关闭了就重新打开*/
  53.              if(qMgr==null || !qMgr.isConnected()){
  54.                  qMgr = new MQQueueManager(qmName);
  55.              }
  56.      MQQueue queue = qMgr.accessQueue(qName, openOptions);
  57.      // 从队列中取出消息
  58.      queue.get(retrieve, gmo);
  59.      message = retrieve.readUTF();    
  60.      System.out.println("The message is: " + message);
  61.      queue.close();
  62.          }catch (MQException ex) {
  63.              System.out.println("A WebSphere MQ error occurred : Completion code "
  64.              + ex.completionCode + " Reason code " + ex.reasonCode);
  65.          }catch (IOException ex) {
  66.              System.out.println("An error occurred whilst writing to the message buffer: " + ex);
  67.          }catch(Exception ex){
  68.              ex.printStackTrace();
  69.          }finally{
  70.              try {
  71.                 qMgr.disconnect();
  72.             } catch (MQException e) {
  73.                 e.printStackTrace();
  74.             }
  75.          }
  76.          return message;
  77.      }
  78.      public static void main(String args[]) {
  79.          /*下面两个方法可同时使用,也可以单独使用*/
  80.         
  81.          getMessage();
  82.      }
  83. }
新手学习中,花了好几天,找了好多篇文章,终于调通了,整理出来希望能帮助到需要的人。以后慢慢研究!!!


阅读(1468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~