消息队列初体验

一、MSMQ(微软的消息队列)

using System;
using System.Collections.Generic;
using System.Text; 消息队列初体验 - 吴桂林 - 分享快乐
 
using System.Messaging;
using System.Transactions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageQueue mq = new MessageQueue();
            //判断队列是否存在
            if (MessageQueue.Exists(@".\Private$\test"))
                MessageQueue.Delete(@".\Private$\test");     //删除队列
            MessageQueue.Create(@".\Private$\test");         //创建队列
            mq.Path = @".\Private$\test";

            #region 路径中使用的语法 
            //公共队列 
            //MachineName\QueueName 
            //专用队列 
            //MachineName\Private$\QueueName 
            //日志队列 
            //MachineName\QueueName\Journal$ 
            //示例:
            //  mq.Path = @"sf00902395d34\Private$\test";  //sf00902395d34是主机名
            //  mq.Path = @"FormatName:DIRECT=OS:sf00902395d34\Private$\test";
            //  mq.Path = @"FormatName:DIRECT=OS:localhost\Private$\test";
            //  访问远程电脑上的消息队列时Path的格式
            //  mq.Path = @"FormatName:DIRECT=OS:server\Private$\test";
            #endregion

            //构造消息
            Message msg = new Message();
            msg.Body = "HelloWorld:" + DateTime.Now.ToString();
            msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });      //消息格式化

            //向队列发送消息
            mq.Send(msg, "001");
            mq.Send(msg, "002");
            mq.Send(msg, "003");
            mq.Send(msg, "004");

            //读取队列中的所有消息
            Message[] msgs = mq.GetAllMessages();
            foreach (Message m in msgs)
            {
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    try
                    {
                        Message mRec = mq.Receive();          //接受消息
                        //Message mRec = mq.ReceiveById("1");          //接受消息
                        //Message mRec = mq.Peek();              //查看
                        //Message mRec = mq.PeekById("002");              //查看
                        mRec.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                        Console.WriteLine(mRec.Body);
                        ts.Complete();
                    }
                    catch
                    {

                    }
                }
            }

             //清除队列中的所有消息
            //mq.Purge();
            Console.Read();
        }
    }
}
问题解决:
一、此计算机上尚未安装消息队列
    控制面板里,选择添加删除,添加删除windows组件,选择服务里的Msmq(Microsoft   Message   Queue)

二、队列不存在,或您没有足够的权限执行该操作。
    打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列 
    也可以用代码解决
    if (!MessageQueue.Exists(".""Private$""MSMQDemo"))
    {
          MessageQueue.Create(".""Private$""MSMQDemo");
    }

二、 IBM WebSphere MQ
            //新建本地队列            
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");          //QM_janus队列管理器名称
            PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_Q);           
            request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");                 //test_queue队列名称
            request.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_LOCAL);
            //request.AddParameter(MQC.MQIA_USAGE, MQC.MQUS_TRANSMISSION);
            PCFMessage[] response = agent.Send(request);

             //删除队列
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
            PCFMessage request = new PCFMessage(CMQCFC.MQCMD_DELETE_Q);
            request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");
            PCFMessage[] response = agent.Send(request);

            //向队列写消息
            MQQueueManager qMgr = new MQQueueManager("test");
            MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_OUTPUT);
            MQMessage message = new MQMessage();
            message.WriteString("message body");
            queue.Put(message);

             //向队列读消息
            MQQueueManager qMgr = new MQQueueManager("test");
            MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_INPUT_AS_Q_DEF);
            MQMessage message = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.Options = MQC.MQGMO_WAIT;
            gmo.WaitInterval = 1000;
            gmo.MatchOptions = MQC.MQMO_NONE;
            queue.Get(message);
            MessageBox.Show(message.ReadString(100));

             //向队列写消息
            MQQueueManager qMgr = new MQQueueManager("QM_janus");
            MQQueue queue = qMgr.AccessQueue("postcard", MQC.MQOO_OUTPUT);
            MQMessage message = new MQMessage();
            message.WriteString("message body");
            queue.Put(message);

             //枚举所有队列
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
            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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值