IBM WebSphere MQ的C#工具類以及源碼(net)


簡單的介紹一下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;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM