简体   繁体   English

Windows服务仅在服务启动时才第一次收到MSMQ消息

[英]Windows service receiving MSMQ message only first time when service starts

I am first time working with both windows service and MSMQ. 我是第一次使用Windows服务和MSMQ。 I am trying to read messages from queue. 我正在尝试从队列中读取消息。 When I start my windows service, i am receiving only first message and next message not able to read, service is still running. 当我启动Windows服务时,我仅收到第一条消息和下一条无法读取的消息,该服务仍在运行。 if I restart the service It is reading first message from the queue. 如果我重新启动服务,它正在从队列中读取第一条消息。 Please let me know how to fix this issue. 请让我知道如何解决此问题。

This is my code on start of my service: 这是我开始服务时的代码:

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();
        }
    }

Just a guess, but I think you shouldn't close the queue: 只是一个猜测,但我认为您不应该关闭队列:

//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();
}

Have you tried adding an event handler and attaching it to the ReceiveCompleted event, as shown in MessageQueue.BeginReceive ? 您是否尝试过添加事件处理程序并将其附加到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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM