Обработка сообщения, которое я только что отправил с ActiveMQ и C # - PullRequest
1 голос
/ 10 декабря 2011

Я новичок в использовании ActiveMQ с C #.Я создал простую форму окна с одной кнопкой и одной меткой.Когда я нажимаю на кнопку, я отправляю сообщение в очередь, и метка инициализируется только что отправленным сообщением.Конечно, я мог бы инициализировать свою метку напрямую, но я хочу, чтобы моя форма скорее использовала сообщение из очереди, чтобы обновить мою метку.

Проблема в том, что мне не удается обработать сообщение в той же самойФорма для обновления моего ярлыка.Мой потребительский код вообще не вызывается, и все же он инициализируется в событии Load моей формы.Вот код

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        InitializeHandlerAMQ();
    }

    private void InitializeHandlerAMQ()
    {
        Tchat tchat = null;
        IDestination dest = _session.GetQueue(QUEUE_DESTINATION);
        using(IMessageConsumer consumer = _session.CreateConsumer(dest))
        {
            IMessage message;
            while((message = consumer.Receive(TimeSpan.FromMilliseconds(2000))) != null)
            {
                var objectMessage = message as IObjectMessage;
                if(objectMessage != null)
                {
                    tchat = objectMessage.Body as Tchat;
                    if (tchat != null)
                    {
                        textBox2.Text += string.Format("{0}{1}", tchat.Message, Environment.NewLine);
                    }
                }
            }
        }
    }

Если я закрою форму окна и перезапущу ее, мой ярлык будет обновлен, но я не хочу закрывать его и открывать заново.

У вас есть идеи, ребята?

1 Ответ

6 голосов
/ 13 декабря 2011

Попробуйте создать класс с делегатом события следующим образом.

Абонентский класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Apache.NMS;
using Apache.NMS.ActiveMQ;
using Apache.NMS.ActiveMQ.Commands;

namespace Utilities
{
    public delegate void QMessageReceivedDelegate(string message);
    public class MyQueueSubscriber : IDisposable
    {
        private readonly string topicName = null;
        private readonly IConnectionFactory connectionFactory;
        private readonly IConnection connection;
        private readonly ISession session;
        private readonly IMessageConsumer consumer;
        private bool isDisposed = false;
        public event QMessageReceivedDelegate OnMessageReceived;

        public MyQueueSubscriber(string queueName, string brokerUri, string clientId)
        {
            this.topicName = queueName;
            this.connectionFactory = new ConnectionFactory(brokerUri);
            this.connection = this.connectionFactory.CreateConnection();
            this.connection.ClientId = clientId;
            this.connection.Start();
            this.session = connection.CreateSession();
            ActiveMQQueue topic = new ActiveMQQueue(queueName);
            //this.consumer = this.session.CreateDurableConsumer(topic, consumerId, "2 > 1", false);
            this.consumer = this.session.CreateConsumer(topic, "2 > 1");
            this.consumer.Listener += new MessageListener(OnMessage);

        }

        public void OnMessage(IMessage message)
        {
            ITextMessage textMessage = message as ITextMessage;
            if (this.OnMessageReceived != null)
            {
                this.OnMessageReceived(textMessage.Text);
            }
        }

        #region IDisposable Members

        public void Dispose()
        {
            if (!this.isDisposed)
            {
                this.consumer.Dispose();
                this.session.Dispose();
                this.connection.Dispose();
                this.isDisposed = true;
            }
        }

        #endregion

    }
}

Winforms В вашей форме окна Подписаться на очередь, как это

    MyQueueSubscriber QueueSubscriber = new MyQueueSubscriber(QueueName, ActiveMQHost, QueueClientId);
    QueueSubscriber.OnMessageReceived += new QMessageReceivedDelegate(QueueSubscriber_OnMessageReceived);

static void QueueSubscriber_OnMessageReceived(string message)
{
        SetText(message);
}

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox1.InvokeRequired)
        {   
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.labelname.value = text;
        }
    }

Ресурсы: К сожалению, не так много ресурсов для обучения C # и ActiveMQ. Попробуйте использовать http://activemq.apache.org/nms/, поскольку это было довольно хорошо.

Попробуйте посмотреть небольшую статью от http://www.codersource.net/MicrosoftNet/CAdvanced/PublishSubscribeinCusingActiveMQ.aspx. Отказ от ответственности: Это мой сайт, и статья была написана мной. Извините за саморекламу. Но я чувствую, что это имеет отношение к теме.

...