O mínimo necessário para escrever um aplicativo de exemplo MSMQ


112

Estou pesquisando há mais de uma hora e encontrando ótimos exemplos de como usar o MSMQ em C # e até mesmo um capítulo inteiro de um livro sobre Message Queue ... Mas, para um teste rápido, tudo que preciso é cobrir é este cenário, nem mesmo de uma forma perfeita, apenas para uma demonstração rápida:

"Aplicativo A": grava uma mensagem na fila de mensagens. (O aplicativo A é um serviço C # do Windows) Agora abro o "Aplicativo B" (é um aplicativo C # winForms) e verifico o MSMQ e vejo que tenho uma nova mensagem.

É isso ... Tudo que eu preciso para uma demonstração simples.

Alguém poderia me ajudar com um exemplo de código para isso? Muito apreciado.


14
o que é voto negativo? Se você sabe algo sobre o assunto, Ok ensine o resto de nós.
Bohn

4
@Sascha: leia o início da minha postagem: "Estou pesquisando há mais de uma hora e encontrando ótimos exemplos de como usar o MSMQ em C # e até mesmo um capítulo completo de um livro sobre Message Queue ... Mas, para um teste rápido, tudo Preciso cobrir este cenário, nem mesmo de uma forma perfeita, apenas para uma demonstração rápida "
Bohn


Verifique também este artigo do MSDN msdn.microsoft.com/en-us/library/…
Desenvolvedor

Respostas:


131
//From Windows Service, use this code
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\SomeTestName"))
{
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Testing Queue";
}
else
{
    // Create the Queue
    MessageQueue.Create(@".\Private$\SomeTestName");
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Newly Created Queue";
}
messageQueue.Send("First ever Message is sent to MSMQ", "Title");

//From Windows application
MessageQueue messageQueue = new MessageQueue(@".\Private$\SomeTestName");
System.Messaging.Message[] messages = messageQueue.GetAllMessages();

foreach (System.Messaging.Message message in messages)
{
    //Do something with the message.
}
// after all processing, delete all the messages
messageQueue.Purge();

Para um cenário mais complexo, você pode usar objetos Message para enviar a mensagem, agrupar seu próprio objeto de classe dentro dela e marcar sua classe como serializável. Certifique-se também de que o MSMQ está instalado em seu sistema


1
Pergunta: na parte superior que você está criando o MessageQueue, precisamos de ambos? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = novo MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn

3
Sim, você precisa de ambas as instruções, uma na verdade cria um MSMQ e a outra apenas inicializa o MSMQ com o caminho
Anand de

6
funcionou como um encanto ... Espero que um dos seus desejos se torne realidade hoje ... Você resolveu uma grande coisa para mim hoje.
Bohn

2
Pequeno erro de digitação: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Deve ser messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen,

4
Para imprimir a saída da fila no console, no corpo do loop de saída, adicione "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .Para sequenciar());". À medida que o MSMQ passa as coisas como objetos serializados, você deve dizer a ele como desserializar os objetos recebidos em sua forma original.
Contango

16

Talvez o código abaixo seja útil para alguém obter uma introdução rápida ao MSMQ .

Então, para começar, sugiro que você crie 3 aplicativos em uma solução:

  1. MessageTo (Windows Form) Adicionar botão 1.
  2. MessageFrom (Windows Form) Adicione 1 richtextbox.
  3. MyMessage (Class Library) Adicionar 1 classe.

Apenas copie o código anterior e experimente. Certifique-se de que o MSMQ esteja instalado em seu MS Windows e que os projetos 1 e 2 tenham referência System.Messaging.

1. MessageTo (Windows Form) Adicionar botão 1.

using System;
using System.Messaging;
using System.Windows.Forms;

namespace MessageTo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            #region Create My Own Queue 

            MessageQueue messageQueue = null;
            if (MessageQueue.Exists(@".\Private$\TestApp1"))
            {
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }
            else
            {
                // Create the Queue
                MessageQueue.Create(@".\Private$\TestApp1");
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }

            #endregion

            MyMessage.MyMessage m1 = new MyMessage.MyMessage();
            m1.BornPoint = DateTime.Now;
            m1.LifeInterval = TimeSpan.FromSeconds(5);
            m1.Text = "Command Start: " + DateTime.Now.ToString();

            messageQueue.Send(m1);
        }
    }
}

2. MessageFrom (Windows Form) Adicione 1 richtextbox.

using System;
using System.ComponentModel;
using System.Linq;
using System.Messaging;
using System.Windows.Forms;

namespace MessageFrom
{
    public partial class Form1 : Form
    {
        Timer t = new Timer();
        BackgroundWorker bw1 = new BackgroundWorker();
        string text = string.Empty;

        public Form1()
        {
            InitializeComponent();

            t.Interval = 1000;
            t.Tick += T_Tick;
            t.Start();

            bw1.DoWork += (sender, args) => args.Result = Operation1();
            bw1.RunWorkerCompleted += (sender, args) =>
            {
                if ((bool)args.Result)
                {
                    richTextBox1.Text += text;
                }
            };
        }

        private object Operation1()
        {
            try
            {
                if (MessageQueue.Exists(@".\Private$\TestApp1"))
                {
                    MessageQueue messageQueue = new MessageQueue(@".\Private$\TestApp1");
                    messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage.MyMessage) });


                    System.Messaging.Message[] messages = messageQueue.GetAllMessages();

                    var isOK = messages.Count() > 0 ? true : false;
                    foreach (System.Messaging.Message m in messages)
                    {
                        try
                        {
                            var command = (MyMessage.MyMessage)m.Body;
                            text = command.Text + Environment.NewLine;
                        }
                        catch (MessageQueueException ex)
                        {
                        }
                        catch (Exception ex)
                        {
                        }
                    }                   
                    messageQueue.Purge(); // after all processing, delete all the messages
                    return isOK;
                }
            }
            catch (MessageQueueException ex)
            {
            }
            catch (Exception ex)
            {
            }

            return false;
        }

        private void T_Tick(object sender, EventArgs e)
        {
            t.Enabled = false;

            if (!bw1.IsBusy)
                bw1.RunWorkerAsync();

            t.Enabled = true;
        }
    }
}

3. MyMessage (Class Library) Adicionar 1 classe.

using System;

namespace MyMessage
{
    [Serializable]
    public sealed class MyMessage
    {
        public TimeSpan LifeInterval { get; set; }

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Aproveitar :)


1
MSQueue thread-safe? Vários aplicativos EXE usando o mesmo MSQueue? E sobre GetAllMessages e Purgue?
Kiquenet

@Kiquenet quora.com/… Espero que ajude você
Desenvolvedor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.