【发布时间】:2014-09-25 14:29:45
【问题描述】:
我有以下代码连接到 ActiveMQ 服务器。 连接有效, 消费者在 AMQ Web 界面上可见, 队列中有消息 但是 OnMessage 没有被执行。
我尝试移动 start 调用,但这无济于事。 TestConnection 显示客户端 ID 和已启动: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);
}
}
}
}
【问题讨论】:
-
发送到Queue的消息是否设置了TTL值?
-
@Tim bish,目前只是使用通过 ActiveMQ Web 界面 (apache-activemq-5.10) 发送的默认消息进行测试。也许 TTL 导致消息消失,但我不希望它们被我的消费者显示为出列。
-
如果消费者的时钟与生产客户端不同步,那么消息将到达消费者并被检测为过期,这将说明它们被它出列。无论如何,在您进行更多调试并提供更多详细信息之前,这是最好的猜测。
-
@Tim bish,感谢您的提示。服务器和客户端之间有 3 分钟的时钟差。 WireShark 显示消息已发送。调试显示 OnMessage 被调用,但不知何故我的日志没有显示它们。
-
这似乎是一个多线程问题{“跨线程操作无效:控制'LogView'从创建它的线程以外的线程访问。”} System.Exception {System.无效操作异常}
标签: c# activemq apache-nms