【问题标题】:Is it possible to prevent auto delete message after read in Msmq在 Msmq 中读取后是否可以防止自动删除消息
【发布时间】:2017-03-15 04:38:56
【问题描述】:

IDE:VS 2010,Winforms:

我有一个简单的 msmq 发送/接收应用程序,我有一个要求,我将读取消息并根据消息,如果该函数未准备好,我将调用其他函数,然后我希望消息在队列中。

我的 Msmq 发送接收代码:

private void button1_Click(object sender, EventArgs e)
    {
        //MSMQ Send :
        if (MessageQueue.Exists(@".\Private$\MyQ"))
        {
            myQ = new MessageQueue(@".\Private$\MyQ");
        }
        else
        {
            myQ = MessageQueue.Create(@".\Private$\MyQ");
        }

        string xmlText = getxmlString();

        System.Messaging.Message msg = new System.Messaging.Message();

        msg.Formatter = new XmlMessageFormatter();
        msg.Body = xmlText;
        msg.Label = "MyXmlMessage";
        msg.Priority = MessagePriority.Normal;
        myQ.Send(msg);

    }  


 private void button2_Click(object sender, EventArgs e)
    {
        //MSMQ Receive
        myQ = new MessageQueue(@".\Private$\MyQ");

        System.Messaging.Message myMsg = myQ.Receive();
        myMsg.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });
        bool IsValidated  = Validate(myMsg.Body.ToString());
    }  

    internal void Validate(string message)
    {
        //some logic  
        return false;
    }  

正如您在接收代码中看到的,我正在接收回消息并验证消息,这里我希望仅当 IsValidated 为真时才从队列中删除该消息,

基本上,我想防止自动删除消息未来为假,并希望在验证后删除队列中的该消息。

你能告诉我我应该做哪些修改来实现这个目标。

【问题讨论】:

    标签: c# winforms visual-studio-2010 msmq


    【解决方案1】:

    你试过Peek吗?

    MessageQueue.Peek 方法

    返回而不删除(查看)此 MessageQueue 引用的队列中的第一条消息。 Peek 方法是同步的,因此它会阻塞当前线程,直到有消息可用。

    【讨论】:

    • 我不知道,让我试试
    • 好的,所以 peek 方法会很有用,但是如果消息经过验证,您能告诉我如何手动从队列中删除该消息,例如。 thatMessage.delete()
    • 正常拨打Receive()
    • 所以假设我查看了消息 A,它在 2 秒内得到验证,在队列之间收到更高优先级的消息 B,如果我执行 myQ.receive(),那么这可能会产生问题,就像我偷看消息A,但消息B被删除,你将如何处理?
    • 这违背了队列的目的(先进先出)。您甚至必须在 PeekReceive 消息 B 之前处理消息 A
    【解决方案2】:
    messageQueue.Formatter = new XmlMessageFormatter(
      new Type[] { typeof(System.Xml.XmlElement) });
    MessageEnumerator iter = messageQueue.GetMessageEnumerator2();
    iter.Reset();
    while (iter.MoveNext(new TimeSpan(1000)))
    {
        System.Messaging.Message msg = iter.Current;
    
        msg.Formatter = new ActiveXMessageFormatter();
        var reader = new StreamReader(msg.BodyStream);
    
        var msgBody = reader.ReadToEnd();
    }
    

    【讨论】:

    • 能否请您 edit 解释为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多