MQ消息隊列的簡稱是一種應用程序對應用程序的通訊方法。說白了也就是經過隊列的方式來對應用程序進行數據通訊。而無需專用連接來連接它們。java
MQ的通信方式linux
1.數據報的方式 Datagram (Send and forget) apache
應用程序在建立完消息後。利用MQ的API將消息發送到隊列中。它充分利用了MQ(once and once only )服務器
2.請求和應答方式 Request/Reply 網絡
發送消息以後需等待對方處理結果。 需考慮以下問題:session
a.等待應答的時間是多少?函數
b.若是沒有應答怎麼辦。工具
c.本次session是否須要保留?post
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"嚮導。
且包含JAVA實現的客戶端程序。由此構成一個完整的客戶端-服務器的流程。
服務端配置
WebSphere MQ"->"WebSphere MQ 資源管理器",進入WebSphere MQ
資源管理器界面。以下圖所示:
圖9
服務端配置
圖10 建立名爲"QM_JACK"的隊列管理器
圖11 在隊列管理中輸入"QM_JACK"
圖12
設置隊列日誌
圖13 建立服務器鏈接通道
圖 14
設置隊列管理器QM_JACK的偵聽端口
圖 15
系統等待界面
圖 16
系統隊列管理器QM_JACK建立成功
圖17 定義本地隊列
圖18 定義本地隊列
圖 19
建立服務器鏈接通道
圖20 建立服務器鏈接通道
Linux下的root用戶使用,那麼,咱們就須要在MQ的服務端(也就是Windows
xp系統中添加名爲"root"的用戶)所在的計算機系統中添加名爲"root"的用戶。具體步驟以下:
圖21
建立系統用戶
圖22 建立系統用戶
Server後系統自動建立的)。具體操做以下:
圖23
設置系統用戶所在組
圖24 設置系統用戶所在組
圖25
設置系統用戶所在組
圖26 設置系統用戶所在組
圖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() + "\n"); 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("接收服務器端返回數據包成功..\n接收數據爲:\n" + 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; } }