簡單的介紹一下MQ常用的對象
Queue Manager |
隊列管理器 |
主要負責管理隊列、通道等,類似與Oracle中的Oracle實例的概念,在一台服務器中可以定義多個Queue Manager。 |
Queue |
隊列 |
是存放Message的對象,是我們主要操作的對象。類似與Oracle中的表的概念。 |
Message |
消息 |
實際放入Queue中的消息,該消息可以存儲字符串、Stream等對象。 |
Channel |
通道 |
是我們的應用以及兩個Queue Manager操作的鏈接對象 |
Process |
過程 |
|
Queue的分類:
Local Queue |
本地隊列 |
主要存儲消息的對象 |
Remote Queue |
遠程隊列 |
和另外一個Queue Manager通訊的隊列 |
Mode Queue |
模板隊列 |
建立一個隊列模板,通過這個模板可以建立與模板相同屬性的動態隊列。 |
Dynamic Queue |
動態對了(臨時隊列) |
可以在程序中創建和刪除的臨時隊列
|
MQ工具類:
using IBM.WMQ; using IBM.WMQ.PCF; using System; using System.Collections.Generic; using System.Linq; using System.Web; //using IBM.WMQAX; /// <summary> /// MQHelp 類庫 /// henrylee /// </summary> public class MQHelp { public MQHelp() { } /// <summary> /// 創建本地隊列 /// </summary> /// <param name="qmName">隊列管理器</param> /// <param name="queueName">隊列名稱</param> /// <param name="isTransmissionQueue">是否為傳輸隊列</param> public void CreateQueue(string qmName, string queueName, bool isTransmissionQueue = false) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_Q); request.AddParameter(MQC.MQCA_Q_NAME, queueName); request.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_LOCAL); if (isTransmissionQueue) request.AddParameter(MQC.MQIA_USAGE, MQC.MQUS_TRANSMISSION); PCFMessage[] response = agent.Send(request); } /// <summary> /// 刪除隊列 /// </summary> public void DelQueue(string qmName, string queueName) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_DELETE_Q); request.AddParameter(MQC.MQCA_Q_NAME, queueName); PCFMessage[] response = agent.Send(request); } /// <summary> /// 讀取消息 /// </summary> /// <returns></returns> public string ReadMessage(string qmName, string queueName) { MQQueueManager qMgr = new MQQueueManager(qmName); MQQueue queue = qMgr.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING); MQGetMessageOptions gmo = new MQGetMessageOptions(); gmo.Options = MQC.MQGMO_WAIT; gmo.WaitInterval = 1000; gmo.MatchOptions = MQC.MQMO_NONE; MQMessage message = new MQMessage(); queue.Get(message); return message.ReadString(message.MessageLength); } /// <summary> /// 寫入消息 /// </summary> public void WriteMessage(string qmName, string queueName, string body) { MQQueueManager qMgr = new MQQueueManager(qmName); MQQueue queue = qMgr.AccessQueue(queueName, MQC.MQOO_OUTPUT); MQMessage message = new MQMessage(); message.WriteString(body); message.Format = MQC.MQFMT_STRING; queue.Put(message); } /// <summary> /// 獲取當前管理器所有隊列 /// </summary> /// <param name="qmName">隊列管理器</param> /// <param name="isFindSystemQueue">是否包含系統隊列</param> /// <returns></returns> public List<string> GetALLQueue(string qmName, bool isFindSystemQueue = false) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES); request.AddParameter(MQC.MQCA_Q_NAME, "*"); PCFMessage[] response = agent.Send(request); string[] names = response[0].GetStringListParameterValue(CMQCFC.MQCACF_Q_NAMES); List<string> result = null; if (!isFindSystemQueue) result = names.ToList().Where(s => !s.Contains("AMQ.") && !s.Contains("SYSTEM.")).ToList(); else result = names.ToList(); return result; } /// <summary> /// 創建遠程隊列 /// </summary> /// <param name="qmName">隊列管理器</param> /// <param name="queueName">隊列名稱</param> /// <param name="ycqmName">遠程隊列管理器名稱</param> /// <param name="ycqueueName">遠程隊列名稱</param> /// <param name="csqueueName">傳輸隊列名稱</param> public void CreateRemoteQueue(string qmName, string queueName, string ycqmName, string ycqueueName, string csqueueName) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_Q); request.AddParameter(MQC.MQCA_Q_NAME, queueName); request.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_REMOTE); request.AddParameter(MQC.MQCA_REMOTE_Q_MGR_NAME, ycqmName); request.AddParameter(MQC.MQCA_REMOTE_Q_NAME, ycqueueName); request.AddParameter(MQC.MQCA_XMIT_Q_NAME, csqueueName); PCFMessage[] response = agent.Send(request); agent.Disconnect(); } /// <summary> /// 創建發送方通道 /// </summary> /// <param name="qmName">隊列管理器</param> /// <param name="channelName">通道名稱</param> /// <param name="transmissionQueueName">傳輸隊列名稱</param> /// <param name="iPPort">IP地址與端口號 例:localhost(1415) </param> public void CreateChannelBySend(string qmName, string channelName, string transmissionQueueName, string iPPort) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_CHANNEL); request.AddParameter(CMQCFC.MQCACH_CHANNEL_NAME, channelName); request.AddParameter(CMQCFC.MQIACH_CHANNEL_TYPE, MQC.MQCHT_SENDER); request.AddParameter(CMQCFC.MQCACH_CONNECTION_NAME, iPPort); request.AddParameter(CMQCFC.MQCACH_XMIT_Q_NAME, transmissionQueueName); PCFMessage[] response = agent.Send(request); agent.Disconnect(); } /// <summary> /// 創建接受方通道 /// </summary> /// <param name="qmName">隊列管理器</param> /// <param name="channelName">管道名稱</param> public void CreateChannelByReceive(string qmName, string channelName) { PCFMessageAgent agent = new PCFMessageAgent(qmName); PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_CHANNEL); request.AddParameter(CMQCFC.MQCACH_CHANNEL_NAME, channelName); request.AddParameter(CMQCFC.MQIACH_CHANNEL_TYPE, MQC.MQCHT_RECEIVER); PCFMessage[] response = agent.Send(request); agent.Disconnect(); } }
以下是前台調用:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { public const string MQNAME1 = "ManageTest1"; public const string MQNAME2 = "ManageTest2"; public readonly MQHelp MQHELP = new MQHelp(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { List<string> list = new MQHelp().GetALLQueue(MQNAME1); list.ForEach(s => ddlQueueList.Items.Add(new ListItem(s))); } } protected void Button1_Click(object sender, EventArgs e) { Button but = sender as Button; switch (but.Text) { case "添加隊列": MQHELP.CreateQueue(MQNAME1, txtQueue.Text.Trim()); break; case "刪除隊列": MQHELP.DelQueue(MQNAME1, txtQueue.Text.Trim()); break; case "添加消息": MQHELP.WriteMessage(MQNAME1, ddlQueueList.SelectedValue, txtMessage.Text.Trim()); break; case "獲取消息": Literal1.Text = MQHELP.ReadMessage(MQNAME1, ddlQueueList.SelectedValue); break; case "添加傳輸隊列": MQHELP.CreateQueue(txtTMName.Text, txtTName.Text.Trim(), true); break; case "刪除傳輸隊列": MQHELP.DelQueue(txtTMName.Text, txtTName.Text.Trim()); break; case "添加遠程隊列": MQHELP.CreateRemoteQueue(txtRMName.Text, txtRQName.Text, txtRMTName.Text, txtRMTQName.Text, txtRTQName.Text); break; case "添加發送方通道": MQHELP.CreateChannelBySend(txtCMName.Text, txtCCName.Text, txtCTName.Text, txtCip.Text); break; case "添加接收方通道": MQHELP.CreateChannelByReceive(txtCMName.Text, txtCCName.Text); break; default: break; } } }