【问题标题】:Windows service receiving MSMQ message only first time when service startsWindows 服务仅在服务启动时第一次接收 MSMQ 消息
【发布时间】:2018-08-28 10:11:42
【问题描述】:

我是第一次同时使用 Windows 服务和 MSMQ。我正在尝试从队列中读取消息。当我启动 Windows 服务时,我只收到第一条消息,下一条消息无法读取,服务仍在运行。如果我重新启动服务它正在从队列中读取第一条消息。请告诉我如何解决此问题。

这是我的服务开始时的代码:

protected override void OnStart(string[] args)
    {

        MessageQueue msMq = null;
        JobModel j = new JobModel();
        msMq = new MessageQueue(queueRequestName);
        try
        {            
            if (msMq != null)
            {                    
                msMq.Formatter = new XmlMessageFormatter(new Type[] { typeof(JobModel) });
                var message = (JobModel)msMq.BeginReceive();        

            }
        }

        catch (MessageQueueException ee)
        {
            Console.Write(ee.ToString());
        }
        catch (Exception eee)
        {
            Console.Write(eee.ToString());
        }
        finally
        {
            msMq.Close();
        }
    }

【问题讨论】:

    标签: c# windows-services msmq


    【解决方案1】:

    只是猜测,但我认为您不应该关闭队列:

    //keep your queue object in the service scope
    //you might need more 
    MessageQueue msMq = null;
    protected override void OnStart(string[] args)
    {   
        JobModel j = new JobModel();
        msMq = new MessageQueue(queueRequestName);
        try
        {            
            if (msMq != null)
            {                    
                msMq.Formatter = new XmlMessageFormatter(new Type[] { typeof(JobModel) });
                var message = (JobModel)msMq.BeginReceive(); 
            }
        }
    
        catch (MessageQueueException ee)
        {
            Console.Write(ee.ToString());
        }
        catch (Exception eee)
        {
            Console.Write(eee.ToString());
        }
    }
    
    //close when you stop
    protected override OnStop() //signature might be differnt
    {
        msMq.Close();
    }
    

    【讨论】:

    • 不,没有用
    • 嗯,你只做一次var message = (JobModel)msMq.BeginReceive();....这段代码是基于某种样本吗?
    • 通常你启动队列,即启动它自己的“监听”状态并让它处理消息接收部分。正如您的代码现在看起来的那样,您只收到一条消息似乎是合乎逻辑的,解决方案并不像我想象的那么简单
    • 是的,我还没有开始处理消息。如何接收多条消息?或者我如何在有消息时立即收到消息
    【解决方案2】:

    您是否尝试过添加事件处理程序并将其附加到 ReceiveCompleted 事件,如 MessageQueue.BeginReceive 所示?

    protected override void OnStart(string[] args)
    {
    
        MessageQueue msMq = null;
        JobModel j = new JobModel();
        msMq = new MessageQueue(queueRequestName);
        msMq.ReceiveCompleted += ReceiveCompletedEventHandler(MyMsMqEventHandler)
        try
        {            
            if (msMq != null)
            {                    
                msMq.Formatter = new XmlMessageFormatter(new Type[] { typeof(JobModel) });
                var message = (JobModel)msMq.BeginReceive();        
    
            }
        }
    
        catch (MessageQueueException ee)
        {
            Console.Write(ee.ToString());
        }
        catch (Exception eee)
        {
            Console.Write(eee.ToString());
        }
    }
    
    public static void MyMsMqEventHandler(object src, ReceiveCompletedEventHandler handler)
    {
         var msMq = (MessageQueue)src;
         var msg = msMq.EndReceive(handler.AsyncResult);
         Console.WriteLine((string)msMq.Body);
         msMq.BeginReceive();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多