簡體   English   中英

如何找到我在msmq中添加的消息

[英]How can I find the message I added in my msmq

我通過濕只是我把它加入到這樣一個窗口服務

public partial class TriggerHostProcesses : ServiceBase
{
    private const string MESSAGE_QUEUE = @".\Private$\Sample Queue";
    private MessageQueue _queue;
    public TriggerHostProcesses()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        SendMessage("Hope This Works");
    }

    protected override void OnStop()
    {
    }

    internal void start()
    {
        OnStart(null);
    }


    private void SendMessage(string message)
    {
        _queue = new MessageQueue(MESSAGE_QUEUE);
        Message msg = new Message();
        msg.Body = message;
        msg.Label = "Testing " + DateTime.Now.ToString();
        _queue.Send(msg,new MessageQueueTransaction());
    }
}

並得到消息

 partial class HostListener : ServiceBase
{
      private const string MESSAGE_QUEUE = @".\Private$\Sample Queue";
    private MessageQueue _queue;

    public HostListener()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            var myTransaction = new MessageQueueTransaction();

            var queue = new MessageQueue(MESSAGE_QUEUE);
            var message = queue.Receive(new TimeSpan(0, 0, 20),myTransaction);
            message.Formatter = new XmlMessageFormatter(
                                new String[] { "System.String,mscorlib" });
            Console.WriteLine(message.Body.ToString());
        }
        catch(Exception ex)
        {
            Console.WriteLine("No Message");
        }
    }

    protected override void OnStop()
    {
        // TODO: Add code here to perform any tear-down necessary to stop your service.
    }

    internal void start()
    {
        OnStart(null);
    }
}

在我的主要我添加了這個

  var ServiceToRun1 = new TriggerHostProcesses();
        var ServiceToRun2 = new HostListener();

        if (Environment.UserInteractive)
        {
            // This used to run the service as a console (development phase only)

            ServiceToRun1.start();
            ServiceToRun2.start();

            Console.WriteLine("Press Enter to terminate ...");
            Console.ReadLine();

            ServiceToRun1.Stop();
            ServiceToRun2.Stop();
        }
        else
        {
            ServiceBase.Run(ServiceToRun1);
        }

我得到異常Timeout for the requested operation has expired.

有人可以檢查他們是否可以看到問題是什么?

我不相信你正確使用交易。 例如,在發送消息時,您使用:

_queue.Send(msg,new MessageQueueTransaction());

但是,這不會開始或提交事務。 MSDN中查看該示例使用以下代碼(由我編輯):

var myTransaction = new MessageQueueTransaction();
myTransaction.Begin();
myQueue.Send("hello world", myTransaction);
myTransaction.Commit();

我不相信您的郵件已發送,因此您的Receive時間已過去。

同樣,您的接收邏輯似乎沒有正確使用事務:

myTransaction.Begin();
var myMessage = myQueue.Receive(myTransaction); 
var body myOrder = (string)myMessage.Body;
myTransaction.Commit();

如果處理消息的異常,您應該Rollback ,以便將它們放回隊列。

這是我的最終產品。 我在Windows服務中使用它。 一次20秒,看看我是否有消息然后做我的過程。

public class MSMQueue:IQueue
    {

        public MSMQueue(string queueName)
        {
            Message_Queue = queueName;
        }

        public string Message_Queue { get; private set; }

        public string Pop()
        {
            MessageQueue queue = new MessageQueue(Message_Queue);

            if (queue.Transactional)
                return popTransactionalQueue(queue, new TimeSpan(0, 0, 1));
            else
                return popNormalQueue(queue, new TimeSpan(0, 0, 1));
        }

        public string Pop(TimeSpan timeSpan)
        {
            MessageQueue myQueue = new MessageQueue(Message_Queue);

            if (myQueue.Transactional)
                return popTransactionalQueue(myQueue, timeSpan);
            else
                return popNormalQueue(myQueue, timeSpan);
        }

        public void Add(string message)
        {
            // Connect to a queue on the local computer.
            MessageQueue myQueue = new MessageQueue(Message_Queue);

            // Send a message to the queue.
            if (myQueue.Transactional)
            {
                var myTransaction = new MessageQueueTransaction();
                myTransaction.Begin();
                myQueue.Send(message, myTransaction);
                myTransaction.Commit();
            }
            else
                myQueue.Send(message);
        }

        #region private methods

        private string popNormalQueue(MessageQueue queue, TimeSpan timeOut)
        {
            var message = queue.Receive(timeOut);
            message.Formatter = new XmlMessageFormatter(
                                new String[] { "System.String,mscorlib" });
            return message.Body.ToString();
        }

        private string popTransactionalQueue(MessageQueue queue, TimeSpan timeOut)
        {

            // Set the formatter.
            queue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});

            // Create a transaction.
            MessageQueueTransaction myTransaction = new 
                MessageQueueTransaction();

            String message=string.Empty;

            try
            {
                myTransaction.Begin();

                Message myMessage = queue.Receive(timeOut, myTransaction); 
                message = (String)myMessage.Body;

                myTransaction.Commit();

            }

            catch (MessageQueueException e)
            {
                myTransaction.Abort();
                throw e;
            }

            return message;
        }

        #endregion
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM