我有以下代码连接到ActiveMQ服务器。 连接工作, 消费者在AMQ Web界面上可见, 队列中有消息 但OnMessage没有执行。
我尝试移动启动电话,但这并没有帮助。 TestConnection显示客户端ID&开始了:真的
队列中的消息数量逐渐减少,根据网络界面,我的消费者正在这样做。
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);
}
}
}
}
答案 0 :(得分:2)
我在这里回答我自己的问题,以供将来参考并帮助其他犯同样错误的人。感谢Tim Bish指出我正确的方向。
此处显示的代码没有任何问题,问题是OnMethod在另一个线程中执行,而不是显示日志记录信息的WinForms控件。 由于异常应该由同一机制显示,所以没有任何错误可见。
找到跨线程操作的解决方案