MSMQ的简单使用

static readonly string mqname=@".\Private$\MSMQ1";


 if (!MessageQueue.Exists(mqname))//判断私有消息是否存在
            {
                MessageQueue.Create(mqname, false);
            }


        private void CreateThread()
        {
            t = new Thread(() =>
            {

                while (true)
                {
                    var mq = new MessageQueue(mqname);
                    System.Messaging.Message message = new System.Messaging.Message();
                    //为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的Recoverable属性为true,
                    //在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为false。 
                    //message.Recoverable = true;
                    message.Body = new Apple { Name = DateTime.Now.ToString(), Price = r.Next() * 100 };
                    message.Formatter = new XmlMessageFormatter(new Type[] { typeof(Apple) });
                    mq.Send(message);

                    Thread.Sleep(1000);
                }
            });
            t.IsBackground = true;
        }

  

static readonly string mqname = @"FormatName:Direct=TCP:192.168.0.21\Private$\MSMQ1";
        static ManualResetEvent signal = new ManualResetEvent(false);
        //static int count = 0;
        static void Main(string[] args)
        {
            var mq = new MessageQueue(mqname);
            mq.Formatter= new XmlMessageFormatter(new Type[] { typeof(Apple) });

            // Add an event handler for the ReceiveCompleted event.
            mq.ReceiveCompleted +=new ReceiveCompletedEventHandler(MyReceiveCompleted);

            mq.BeginReceive();
            //mq.PeekCompleted += Mq_PeekCompleted;
            //mq.BeginPeek();

            //signal.WaitOne();
            Console.ReadKey();
        }

        private static void Mq_PeekCompleted(object sender, PeekCompletedEventArgs e)
        {
            try
            {
                // Connect to the queue.
                MessageQueue mq = (MessageQueue)sender;
                Message m = mq.EndPeek(e.AsyncResult);
                Apple a = (Apple)m.Body;
                Console.WriteLine(a.Price.ToString() + "\t" + a.Name);        
                mq.BeginPeek();
            }
            catch (MessageQueueException)
            {
                
            }

        }

        private static void MyReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            try
            {
                MessageQueue mq = (MessageQueue)sender;            
                Message m = mq.EndReceive(e.AsyncResult);
                Apple a = (Apple)m.Body;
                Console.WriteLine(a.Price.ToString()+"\t"+a.Name);      
                mq.BeginReceive();
                
            }
            catch (MessageQueueException)
            {
            }

           
        }

msdn手册:https://msdn.microsoft.com/zh-cn/library/system.messaging.messagequeue.beginpeek(v=vs.80).aspx

MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案:

服务器上消息队列权限设置:给ANONYMOUS LOGON赋予所有权限;

修改服务器的注册表,允许非验证客户端访问

注册表新增HKLM\Software\Microsoft\MSMQ\Parameters\security\AllowNonauthenticatedRpc项,设置其DWORD值为1

注册表新增HKLM\Software\Microsoft\MSMQ\Parameters\security\NewRemoteReadServerDenyWorkgroupClient项,设置其DWORD值为1

 

MSMQ的安全访问控制说明参见:http://msdn.microsoft.com/en-us/library/4108f68e-80f5-40e1-b3df-b713cc4dff79(prot.20).aspx

 

peek和receive的区别:receive后消息队列清空;peek不清空。

转载于:https://www.cnblogs.com/tgdjw/p/5763658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值