zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/changlin/p/4443658.html
Copyright © 2011-2022 走看看