• 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.21Private$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() + "	" + 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()+"	"+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赋予所有权限;

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

    注册表新增HKLMSoftwareMicrosoftMSMQParameterssecurityAllowNonauthenticatedRpc项,设置其DWORD值为1

    注册表新增HKLMSoftwareMicrosoftMSMQParameterssecurityNewRemoteReadServerDenyWorkgroupClient项,设置其DWORD值为1

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

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

  • 相关阅读:
    在Linux下OpenCV的下载和编译
    安装GDB-ImageWatch ,在QT中查看图像
    linux下对qt编写的程序进行部署
    GOQTTemplate简单介绍
    寻找激光的交叉点
    基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
    图像处理工程师的要求研究
    如何将QT的pro图标修改的更显著一些
    快速阅读《QT5.9 c++开发指南》2
    小米盒子连接老式电脑显示器(VGA接口)
  • 原文地址:https://www.cnblogs.com/tgdjw/p/5763658.html
Copyright © 2020-2023  润新知