.net - MSMQ和轮询以接收消息?

标签 .net msmq

我有一个Windows服务,可以进行一些图像转换。当任何文件(在特定文件夹中)被重命名时(即重命名文件监视程序),它将通过触发来工作。在我将大量图像转储(并重命名)到该文件夹​​之前,效果很好。 CPU红线等。
因此,我将更改代码以使用 MSMQ 将所有需要转换的文件排队。美好的。每次重命名文件并触发文件查看器时,我便向队列添加一条新消息。 KEWL。
问题是这-> 我如何一次从队列中抓取一封邮件?
我是否需要使计时器对象每xxx秒轮询一次队列?或者有没有办法不断观察队列中的第一个项目。消息存在后,将其提取,处理,然后继续(这意味着,继续窥视直到世界崩溃)。
我想知道是否只需要在Receive方法周围放置一会儿循环。 pseduo代码在下面(在Edit#2中)...
有人对此有任何经验并有建议吗?
谢谢!
编辑:
如果要使用WCF,可以有人提供示例代码等吗?
编辑2:
这是我正在考虑的一些伪代码....

// Windows service start method.
protected override void OnStart(string[] args)
{
   // some initialisation stuf...

   // Start polling the queue.
   StartPollingMSMQ();

   // ....
}

private static void StartPollingMSMQ()
{
    // NOTE: This code should check if the queue exists, instead of just assuming it does.
    //       Left out for berevity.
    MessageQueue messageQueue = new MessageQueue(".\\Foo");

    while (true)
    {
        // This blocks/hangs here until a message is received.
        Message message = messageQueue.Receive(new TimeSpan(0, 0, 1));

        // Woot! we have something.. now process it...
        DoStuffWithMessage(message);

        // Now repeat for eva and eva and boomski...
    }
}

最佳答案

如果使用本地队列,则不需要WCF。

这是我的示例服务(Windows服务项目中的服务类别)的外观:

using System.Messaging;
public partial class MQProcessTest1 : ServiceBase
{
    //a name of the queue
    private const string MqName = @".\Private$\test1";
    //define static local private queue
    private static MessageQueue _mq;
    //lazy local property through which we access queue (it initializes queue when needed)
    private static MessageQueue mq
    {
        get
        {
            if (_mq == null)
            {
                if (!MessageQueue.Exists(MqName))
                    MessageQueue.Create(MqName);
                _mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
                _mq.Formatter = new BinaryMessageFormatter();
            }
            return _mq;
        }
    }

    //constructor
    public MQProcessTest1()
    {
        InitializeComponent();
        //event to process received message 
        mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
    }

    //method to process message
    private void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {
        //queue that have received a message
        MessageQueue cmq = (MessageQueue)sender;
        try
        {
            //a message we have received (it is already removed from queue)
            Message msg = cmq.EndReceive(e.AsyncResult);
            //here you can process a message
        }
        catch
        {
        }
        //refresh queue just in case any changes occurred (optional)
        cmq.Refresh();
        //tell MessageQueue to receive next message when it arrives
        cmq.BeginReceive();
    }

    protected override void OnStart(string[] args)
    {
        //let start receive a message (when arrives)
        if (mq != null)
            mq.BeginReceive();
        //you can do any additional logic if mq == null
    }

    protected override void OnStop()
    {
        //close MessageQueue on service stop
        if (mq != null)
            mq.Close();
        return;
    }
}

关于.net - MSMQ和轮询以接收消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198182/

相关文章:

c# - 秒表耗时线程安全

c# - 有没有办法用 C# 编辑 pdf?

msmq - 如何从队列中读取 MSMQ 消息对象作为消息正文的字符串

c# - 是否有 .net 驱动程序支持与 PostgreSQL 完全验证的 SSL 连接?

c# - 获取应用程序的 NotifyIcon 矩形?

.net - Oracle Entity Framework 提供程序

windows-services - Msmq 和 WCF 服务

msmq - Windows重启后MSMQueue的值还能保留吗?

msmq - 是否可以使用 Fiddler 跟踪 MSMQ 通过 HTTP 生成的 http 流量?