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