MQ消息队列的简称是一种应用程序对应用程序的通信方法。说白了也就是通过队列的方式来对应用程序进行数据通信。而无需专用链接来链接它们。
MQ的通讯方式
1.数据报的方式 Datagram (Send and forget)
应用程序在创建完消息后。利用MQ的API将消息发送到队列中。它充分利用了MQ(once and once only )
2.请求和应答方式 Request/Reply
发送消息之后需等待对方处理结果。 需考虑如下问题:
a.等待应答的时间是多少?
b.如果没有应答怎么办。
c.本次session是否需要保留?
MQ的开发流程
1.让应用程序与队列管理器链接,通过MQconnect调用来进行此链接。
2.使用MQOpen调用为输出打开一个队列
3.应用程序使用MQPut调用将其数据放到队列上。
4.调用MQOpen调用打开输入队列
5.使用MQGet从队列上接收数据
安装步骤。(此处为转载文章,作者已经证实所有步骤。)
服务端的安装:
Windows版服务器CD-ROM插入CD-ROM驱动器。
安装启动板"窗口为止。
- WebSphere MQ CD
- 因特网
- 网络
注意:对于定制安装,可能不需要所有的必备软件。
MQ"安装选项
(9)选择启动WebSphere
MQ安装程序,然后等待,直到显示了带有欢迎信息的"WebSphere MQ安装"窗口为止。
(10)单击"下一步"按钮继续。
(11)阅读面板上的信息和许可证条款,选择接受,然后单击"下一步"。
(12)如果机器上未安装过此产品的前一个版本,则显示"安装类型"面板。选择希望的安装类型(一般选择"典型"安装即可),然后单击"下一步"按钮。
(13)"WebSphere
MQ安装"窗口显示"安装WebSphere MQ就绪"信息。该窗口还显示用户选中的安装摘要,单击"安装"开始正式安装。
MQ后,"WebSphere MQ安装"窗口显示以下信息:安装向导成功完成。
MQ"向导。
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/88fed17920c54dfc874a09422445c76d.jpg)
![技术分享图片](https://image.cha138.com/20210808/5a62556743cb47ce81534ab40e97176b.jpg)
![技术分享图片](https://image.cha138.com/20210808/b28844e2908747409b5ff5cb8c945918.jpg)
![技术分享图片](https://image.cha138.com/20210808/b5592260b6264aa68cd52ebb8bfead7f.jpg)
![技术分享图片](https://image.cha138.com/20210808/b2f55ffab5f24379845013e96f9bc005.jpg)
![技术分享图片](https://image.cha138.com/20210808/4c32f721b393432f9d2e7e1ca1ace431.jpg)
![技术分享图片](https://image.cha138.com/20210808/afb0ab5b762146c0804cc43ce1063743.jpg)
![技术分享图片](https://image.cha138.com/20210808/f153bcb2bae54433a809de56e063e60a.jpg)
![技术分享图片](https://image.cha138.com/20210808/5f83e6840aed4f2db93c64f74eb3c061.jpg)
![技术分享图片](https://image.cha138.com/20210808/cc53a60b80e84f28aee6a479a1246ca7.jpg)
![技术分享图片](https://image.cha138.com/20210808/549247807df946eebcb38922c98f62fb.jpg)
![技术分享图片](https://image.cha138.com/20210808/def7d42a86514e2e9ecd741b37619fbd.jpg)
![技术分享图片](https://image.cha138.com/20210808/de6f91db01fc442fbf58af28e30fd7d9.jpg)
![技术分享图片](https://image.cha138.com/20210808/5c4b3508b0b640c6a0befe94bcfc17cd.jpg)
![技术分享图片](https://image.cha138.com/20210808/824b2ef3adf542518311917b4c1e81b3.jpg)
![技术分享图片](https://image.cha138.com/20210808/10698dd8d9e94822ae0379e73d4b2925.jpg)
![技术分享图片](https://image.cha138.com/20210808/bd53a32f88514aea9487a8dd84f149d6.jpg)
且包含JAVA实现的客户端程序。由此构成一个完整的客户端-服务器的流程。
服务端配置
WebSphere MQ"->"WebSphere MQ 资源管理器",进入WebSphere MQ
资源管理器界面。如下图所示:
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
服务端配置
![技术分享图片](https://image.cha138.com/20210808/777919df76c747fa8f30860e251c2dad.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/24ff25fcdd44445fad4e47b5b93f1906.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/88fee367a828460e8c5246f475ede0d8.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
设置队列日志
![技术分享图片](https://image.cha138.com/20210808/51f10601e6b0462893318f5421d35bd3.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/56544d2a996b4ac7a3570a6ff1f51aea.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
设置队列管理器QM_JACK的侦听端口
![技术分享图片](https://image.cha138.com/20210808/ffed6906523e4c5babc71fa2a61df92f.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
系统等待界面
![技术分享图片](https://image.cha138.com/20210808/a6a1dab61d8a4cccb27d30f207d84792.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
系统队列管理器QM_JACK创建成功
![技术分享图片](https://image.cha138.com/20210808/1e8d500cdc4f448181b873cf2d984bc9.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/9fed40f9555d4104bea832b916e4be6a.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/f8c90dae3066423ca96eb787e53c24f6.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
创建服务器连接通道
![技术分享图片](https://image.cha138.com/20210808/575848724111429d8685e3d613d024d8.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/3b54d9ac969345a8a4d2e8fe826ad378.jpg)
Linux下的root用户使用,那么,我们就需要在MQ的服务端(也就是Windows
xp系统中添加名为"root"的用户)所在的计算机系统中添加名为"root"的用户。具体步骤如下:
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
创建系统用户
![技术分享图片](https://image.cha138.com/20210808/ce0c8b35d2c8401eae5324237ad826ad.jpg)
图22 创建系统用户
Server后系统自动创建的)。具体操作如下:
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
设置系统用户所在组
![技术分享图片](https://image.cha138.com/20210808/0aa24d8aa4264c91a275ec40e2ac8d1f.jpg)
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/77d3bafbf10a42b68f273ea9c1ffe5a1.jpg)
图25
设置系统用户所在组
![技术分享图片](https://my.oschina.net/js/ke/themes/common/anchor.gif)
![技术分享图片](https://image.cha138.com/20210808/e86678efc6f748709c94aa9396a8b809.jpg)
图27 设置系统用户所在组
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.MQQueue; import com.ibm.mq.MQQueueManager; /** * 函数功能: MQjava客户端实现 */ public class MQClient { /** * Logger for this class */ private static final Log logger = LogFactory.getLog(MQClient.class); private String strExtraSendXmlFileName = "D:\\jndi.properties"; private static Properties props; static { props = new Properties(); props.put("mqHostName", "139.31.89.67"); props.put("mqPort", "4032"); props.put("mqCCSID", "1381"); props.put("mqUserName", "liujx"); props.put("mqPassword", "linux"); props.put("mqQManager", "Monitor_Queue_Manager"); props.put("mqChannel", "Monitor_Conn_Chanel"); props.put("mqLocalOutQueue", "Q_RECEIVE"); props.put("mqLocalInQueue", "Q_RECEIVE"); } /** * * 函数功能:TODO 主测试方法 <br> * 相关参数: <br> * * @param args * 修改记录: <br> */ public static void main(String[] args) { MQClient test = new MQClient(); // 发送消息 test.putMsg(); // 接收消息 test.getMsg(); } public void putMsg() { // MQ发送数据 try { // 建立MQ客户端应用上下文环境 MQEnvironment.hostname = props.getProperty("mqHostName"); MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort")); MQEnvironment.CCSID = Integer .parseInt(props.getProperty("mqCCSID")); MQEnvironment.channel = props.getProperty("mqChannel"); MQEnvironment.userID = props.getProperty("mqUserName"); MQEnvironment.password = props.getProperty("mqPassword"); // 连接队列管理器 MQQueueManager qMgr = new MQQueueManager( props.getProperty("mqQManager")); int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING; // 打开队列 MQQueue q = null; try { q = qMgr.accessQueue(props.getProperty("mqLocalOutQueue"), openOptions); } catch (MQException me) { System.out.println("打开队列出现通讯异常" + me.getMessage() + " "); return; } InputStream fins = new FileInputStream(new File( strExtraSendXmlFileName)); byte[] data = new byte[fins.available()]; fins.read(data); fins.close(); MQMessage msg = new MQMessage(); msg.write(data); // 放入消息 q.put(msg); System.out.println("客户端发送数据包成功.."); // 关闭队列 q.close(); // 断开队列管理器连接 qMgr.disconnect(); } catch (MQException e) { if (logger.isDebugEnabled()) logger.debug(e.getMessage()); e.printStackTrace(); } catch (Exception e) { if (logger.isDebugEnabled()) logger.debug(e.getMessage()); e.printStackTrace(); } } /** * * 函数功能:TODO 获取数据 <br> * 修改记录: <br> */ public void getMsg() { // MQ接收数据 try { // 建立用上下文环境 MQEnvironment.hostname = props.getProperty("mqHostName"); MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort")); MQEnvironment.CCSID = Integer .parseInt(props.getProperty("mqCCSID")); MQEnvironment.channel = props.getProperty("mqChannel"); MQEnvironment.userID = props.getProperty("mqUserName"); MQEnvironment.password = props.getProperty("mqPassword"); // 建立队列管理器 MQQueueManager qMgr = new MQQueueManager( props.getProperty("mqQManager")); int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING; // 打开队列 MQQueue q = qMgr.accessQueue(props.getProperty("mqLocalInQueue"), openOptions); MQGetMessageOptions mgo = new MQGetMessageOptions(); mgo.options |= MQC.MQGMO_NO_WAIT; // 构造返回消息 MQMessage msg = new MQMessage(); if ((msg = fetchOneMsg(q)) != null) { byte[] xmlData = new byte[msg.getDataLength()]; msg.readFully(xmlData); logger.info(new String(xmlData)); System.out.println("接收服务器端返回数据包成功.. 接收数据为: " + new String(xmlData)); } // 关闭队列 q.close(); // 断开队列管理器 qMgr.disconnect(); } catch (MQException e) { logger.error(e); e.printStackTrace(); } catch (Exception e) { logger.error(e); e.printStackTrace(); } } /** * * 函数功能:TODO 从队列中取出消息 <br> * 相关参数: <br> * * @param q * @return * @throws Exception * 修改记录: <br> */ private static MQMessage fetchOneMsg(MQQueue q) throws Exception { MQGetMessageOptions mgo = new MQGetMessageOptions(); mgo.options |= MQC.MQGMO_NO_WAIT; MQMessage msg = new MQMessage(); try { // 获取消息 q.get(msg, mgo); } catch (MQException e) { return null; } return msg; } }