C# Apache.NMS MessageListener OnMessage не запускается

У меня есть следующий код для подключения к серверу ActiveMQ. Соединение работает, потребитель виден в веб-интерфейсе AMQ, в очереди есть сообщения, но OnMessage не выполняется.

Я пытался переместить стартовый вызов, но это не помогает. TestConnection показывает идентификатор клиента и запущено: true

Количество сообщений в очереди медленно уменьшается, и в соответствии с веб-интерфейсом это делает мой потребитель.

веб-интерфейс, показывающий очереди

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Apache.NMS;

namespace MQLed
{
    class amqclientns
    {
        public String UriString = "activemq:tcp://hostname:61616";
        public string UserName = "";
        public string Password = "";
        private IConnection connection;
        private ISession session;
        private IDestination destination;
        private IMessageConsumer consumer;

        public ILogger Logger = null;

        public void TestLog(string Message) 
        {
            if (Logger != null) Logger.WriteLine(Message);
        }

        public void Connect()
        {
            try
            {
                IConnectionFactory factory = new NMSConnectionFactory(new Uri(UriString));
                connection = factory.CreateConnection(UserName, Password);
                connection.ExceptionListener += new ExceptionListener(OnException);
                session = connection.CreateSession();
                destination = session.GetDestination("queue://" + "mqled");
                consumer = session.CreateConsumer(destination);
                // connection.Start();
                consumer.Listener += new MessageListener(OnMessage);
                connection.Start();

                // OnMessage(consumer.ReceiveNoWait());
                if (Logger != null) Logger.WriteLine("Listening on " + destination.ToString());
            }
            catch (Exception ex)
            {
                if (Logger != null) Logger.WriteLine(ex.Message);
            }
        }

        public void TestConnection()
        {
            if (Logger != null) {
                Logger.WriteLine("TestConnection");
                Logger.WriteLine("Client id: " + connection.ClientId);
                Logger.WriteLine("Connection started: " + connection.IsStarted);
                Logger.WriteLine("Connection metadata: " + connection.MetaData);

                Logger.WriteLine("Consumer: " + consumer.ToString());
            }

        }

        public void Disconnect()
        {
            connection.Close();
        }

        public void OnException(Exception e)
        {
            Logger.Log(e.Message, "Exception");
        }

        public void OnMessage(IMessage message)
        {
            Logger.WriteLine("OnMessage " + (message != null).ToString());
            try
            {
                if (Logger != null) Logger.WriteLine("Message received");
                ITextMessage msg = (ITextMessage)message;
                message.Acknowledge();
                if (Logger != null) Logger.WriteLine(msg.Text);
            }
            catch (Exception ex)
            {
                if (Logger != null) Logger.WriteLine(ex.Message);
            }
        }
    }
}

1 ответ

Я отвечаю на свой вопрос здесь, для дальнейшего использования и для помощи другим, кто совершит ту же ошибку. Спасибо Тиму Бишу за то, что он указал мне правильное направление.

В показанном здесь коде нет ничего плохого, проблема в том, что OnMethod выполняется в другом потоке, чем элемент управления WinForms, который отображает информацию журнала. Поскольку исключения должны были отображаться с помощью того же механизма, ни одна из ошибок не была видна.

Решение для работы с несколькими потоками можно найти здесь /questions/1484633/kak-ya-mogu-ispravit-oshibku-dostup-iz-potoka-otlichnogo-ot-potoka-v-kotorom-on-byil-sozdan/1484651#1484651

Другие вопросы по тегам