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. flask请求上下文 (转)

    本篇阅读目录 一.flask中的CBV 二.werkzeug + 上下文初步解读 三.偏函数和线程安全 回到顶部 一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV ...

  2. 浅谈labviEW定时器

    Labview提供了五种定时器:普通定时器3种: Tick Count (ms). Wait(ms).Wait Until Next ms  Multipule(等待下一个毫秒的整数倍) API函数定 ...

  3. VB非常见知识总结

    1.VB.Net设置Excel中单元格字体 sheet.Range(sheet.Cells(row, stp), sheet.Cells(row, stp)).Font.Name = "Wi ...

  4. kuangbin专题 专题一 简单搜索 Fire Game FZU - 2150

    题目链接:https://vjudge.net/problem/FZU-2150 题意:’ . '代表火无法烧着的地方,‘ # ’表示草,火可以烧着.选择任意两个‘ # ’(可以两个都选同一个 ‘ # ...

  5. 基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  6. ES6中用&&跟||来简化if{}else{}的写法

    目录 ES6中用&&跟||来简化if{}else{}的写法 1. if else的写法 2. ES6中 && ||的用法 3 ES6实例 4 开发环境 ES6中用&am ...

  7. Java - 格式化输出JSON字符串的两种方式

    目录 1 使用阿里的fastjson 1.1 项目的pom.xml依赖 1.2 Java示例代码 2 使用谷歌的gson 2.1 项目的pom.xml依赖 2.2 Java示例代码 1 使用阿里的fa ...

  8. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...

  9. 基于 Jmeter 的 web 端接口自动化测试平台(转载)

    框架 功能点 批量导入har包生成接口用例 接口用例分组树形展示 用例编辑失焦自动保存 用例编写提供快捷调试模块 支持多类型参数,json+文本两种校验 支持同一个项目中接口参数传递 提供即时任务+每 ...

  10. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitMQ(一)已经入门RabbitMQ,本文介绍Rabb ...