package com.mqapi;
 
/** 
* @modified by actorai E-mail:actorai@163.com 
* @version 创建时间:2010-9-15
* 通过MQ API方式连接MQ;绑定服务器方式
* WebSphere MQ classes for Java的绑定模式与客户连接模式存在下列区别:
* 1 忽略了MQEnvironmnet类所提供的大多数参数。
* 2 绑定模式支持MQBEGIN和快速绑定。
* 类说明 
*/
import java.io.IOException;  
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 MessageByMQ_Bind{  
     //定义队列管理器和队列的名称  
     private static String qmName;   
     private static String qName;  
     private static MQQueueManager qMgr;  
     static
      //绑定模式只适用于那些运行在作为队列管理器主机的WebSphere MQ 服务器上的程序
      //不需要设置一下环境变量
         //设置环境:  
         //MQEnvironment中包含控制MQQueueManager对象中的环境的构成的静态变量,MQEnvironment的值的设定会在MQQueueManager的构造函数加载的时候起作用,  
         //因此必须在建立MQQueueManager对象之前设定MQEnvironment中的值.  
         //MQEnvironment.hostname="10.0.4.213";          //MQ服务器的IP地址        
         //MQEnvironment.channel="CLIENT.QM_APPLE";              //服务器连接的通道  
         //MQEnvironment.CCSID=1381;                      //服务器MQ服务使用的编码1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID)  
         //MQEnvironment.port=1415;                       //MQ端口  
         qmName = "QM_APPLE";                          //MQ的队列管理器名称  
         qName = "01";                               //MQ远程队列的名称  
         try {  
             //定义并初始化队列管理器对象并连接   
             //MQQueueManager可以被多线程共享,但是从MQ获取信息的时候是同步的,任何时候只有一个线程可以和MQ通信。  
            qMgr = new MQQueueManager(qmName);  
        } catch (MQException e) {  
            // TODO Auto-generated catch block  
            System.out.println("初使化MQ出错");  
            e.printStackTrace();  
        }   
     }  
     /** 
      * 往MQ发送消息 
      * @param message 
      * @return 
      */
     public static int sendMessage(String message){  
         int result=0;  
         try{     
             //设置将要连接的队列属性  
             // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface   
             //(except for completion code constants and error code constants).  
             //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.  
             //MQOO_OUTPUT:Open the queue to put messages.  
             /*目标为远程队列,所有这里不可以用MQOO_INPUT_AS_Q_DEF属性*/
             //int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;  
             /*以下选项可适合远程队列与本地队列*/
             int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;  
             //连接队列   
             //MQQueue provides inquire, set, put and get operations for WebSphere MQ queues.   
             //The inquire and set capabilities are inherited from MQManagedObject.   
             /*关闭了就重新打开*/
            if(qMgr==null || !qMgr.isConnected()){  
                qMgr = new MQQueueManager(qmName);  
            }  
             MQQueue queue = qMgr.accessQueue(qName, openOptions);            
             //定义一个简单的消息  
             MQMessage putMessage = new MQMessage();   
             //将数据放入消息缓冲区  
             putMessage.writeUTF(message);    
             //设置写入消息的属性(默认属性)  
             MQPutMessageOptions pmo = new MQPutMessageOptions();             
             //将消息写入队列   
             queue.put(putMessage,pmo);   
             queue.close();  
         }catch (MQException ex) {   
             System.out.println("A WebSphere MQ error occurred : Completion code "  
             + ex.completionCode + " Reason code " + ex.reasonCode);   
             ex.printStackTrace();  
         }catch (IOException ex) {   
             System.out.println("An error occurred whilst writing to the message buffer: " + ex);  
         }catch(Exception ex){  
             ex.printStackTrace();  
         }finally{  
             try {  
                qMgr.disconnect();  
            } catch (MQException e) {  
                e.printStackTrace();  
            }  
          }  
         return result;  
     }  
     /** 
      * 从队列中去获取消息,如果队列中没有消息,就会发生异常,不过没有关系,有TRY...CATCH,如果是第三方程序调用方法,如果无返回则说明无消息 
      * 第三方可以将该方法放于一个无限循环的while(true){...}之中,不需要设置等待,因为在该方法内部在没有消息的时候会自动等待。 
      * @return 
      */
     public static String getMessage(){  
         String message=null;  
         try{              
             //设置将要连接的队列属性  
             // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface   
             //(except for completion code constants and error code constants).  
             //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.  
             //MQOO_OUTPUT:Open the queue to put messages.  
             int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;  
             MQMessage retrieve = new MQMessage();  
             //设置取出消息的属性(默认属性)  
             //Set the put message options.(设置放置消息选项)   
             MQGetMessageOptions gmo = new MQGetMessageOptions();   
             gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;//Get messages under sync point control(在同步点控制下获取消息)   
             gmo.options = gmo.options + MQC.MQGMO_WAIT;  // Wait if no messages on the Queue(如果在队列上没有消息则等待)   
             gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;// Fail if Qeue Manager Quiescing(如果队列管理器停顿则失败)   
             gmo.waitInterval = 1000 // Sets the time limit for the wait.(设置等待的毫秒时间限制)   
             /*关闭了就重新打开*/
            if(qMgr==null || !qMgr.isConnected()){  
                qMgr = new MQQueueManager(qmName);  
            }  
             MQQueue queue = qMgr.accessQueue(qName, openOptions);   
             // 从队列中取出消息  
             queue.get(retrieve, gmo);  
             //message = retrieve.readUTF(); //此方法读通过MQ资源管理器放入的消息会IO读写错误,通过MQ资源管理器放入的测试消息就不是UTF这样的格式的,所以会报错
             message = retrieve.readLine();  //此方法读xml格式,有网友提到可能会报错
             System.out.println("The message is: " + message);   
             queue.close();  
         }catch (MQException ex) {   
             System.out.println("A WebSphere MQ error occurred : Completion code "  
             + ex.completionCode + " Reason code " + ex.reasonCode);   
         }catch (IOException ex) {   
             //System.out.println("An error occurred whilst writing to the message buffer: " + ex);
          ex.printStackTrace();
         }catch(Exception ex){  
             ex.printStackTrace();  
         }finally{  
             try {  
                qMgr.disconnect();  
            } catch (MQException e) {  
                e.printStackTrace();  
            }  
         }  
         return message;  
     }  
    
     public static void main(String args[]) {  
         /*下面两个方法可同时使用,也可以单独使用*/
         sendMessage("this is a test by MQ API Binding model");  
         //getMessage();  
    
    

JAVA MQ API方式通信采用Binding MQ Server方式的更多相关文章

  1. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  2. C++/java之间的Socket通信大小端注意事项

    在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...

  3. api接口对于客户端的身份认证方式以及安全措施

    转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...

  4. 分布式事务(二)Java事务API(JTA)规范

    一.引子 既然出现了分布式场景(DTP模型), 大java也及时制定出一套规范来给各大应用服务器.数据库/mq等厂商使用,以方便管理互通--->JTA闪亮登场.JTA(Java Transact ...

  5. MQ与webservice的区别,MQ的区别

    Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Webservice近乎实时通信,而MQ却通常是延时通信. 什么意思 ...

  6. Android使用Java Mail API发送邮件

    最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...

  7. java基础3.0:Java常用API

    本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...

  8. Java Attach API

    catalog . instrucment与Attach API . BTrace: VM Attach的两种方式 . Sun JVM Attach API 1. instrucment与Attach ...

  9. 关于 Java Collections API 您不知道的 5 件事--转

    第 1 部分 http://www.ibm.com/developerworks/cn/java/j-5things2.html 对于很多 Java 开发人员来说,Java Collections A ...

随机推荐

  1. Json串排序

    最近遇到个很烦人的问题.我现在做的业务有一部分是把之前app服务端的.net接口转译java接口.但是有些之前的接口,一个接口干上十几件事情,返回的json串长达五六几百行.着实看的就让人头大.但是如 ...

  2. Hash的应用

    思路:此题比较简单,直接贴代码 #include <stdio.h> int main(){ int N; ){ ]={}; ;i<N;i++){ int x; scanf(&quo ...

  3. Bzoj 2281 [Sdoi2011]黑白棋 题解

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][ ...

  4. C语言指针专题——如何理解指针

    本文为原创,欢迎转发! 最近在研读C primer plus 5版中文版,老外写的,还是很经典的,推荐给读者们,有需要的朋友可以在这里购买:C primer plus 5版中文版 指针,传说中是C语言 ...

  5. Java开发IDEA插件推荐

    IDEA插件推荐 Alibaba Java Coding Guidelines MyBatisCodeHelper-Pro Lombok GsonFormat AceJump Statistic Tr ...

  6. Excel催化剂开源第10波-VSTO开发之用户配置数据与工作薄文件一同存储

    在传统的VBA开发中,若是用的是普通加载项方法,是可以存储数据在xlam上的,若用的是Com加载项方法同时是Addins程序级别的项目开发的,配置文件没法保存到工作薄中,一般另外用配置文件来存放供调用 ...

  7. 题解 P2835 【刻录光盘】

    P2835 刻录光盘 来一波FLOYD最短代码qwq #include<cstdio> using namespace std; #define FOR(i) for (register ...

  8. Flutter初体验--环境搭建

    Fluter最近火了起来,它的有点很多,今天我做一篇在Windows下安装Flutter的教程. 一.下载    无论你要安装什么软件,都要先下载下来.我用的是SourceTree,地址: https ...

  9. lambda匿名函数,sorted(),filter(),map(),递归函数

    1.lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n* ...

  10. .NET开发框架(八)-服务器集群之网络负载平衡演示(视频)

    (有声视频-服务器集群之负载平衡-NLB演示) 观看NLB视频的童鞋,都会继续观看IIS的负载平衡教程,点击>> 本文以[图文+视频],讲解Windows服务器集群的网络负载平衡NLB的作 ...