【问题标题】:C# Apache.NMS MessageListener OnMessage not firingC# Apache.NMS MessageListener OnMessage 未触发
【发布时间】: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


【解决方案1】:

我在这里回答我自己的问题,以供将来参考并帮助其他犯同样错误的人。感谢 Tim Bish 为我指明了正确的方向。

这里显示的代码没有任何问题,问题是 OnMethod 在另一个线程中执行,而不是显示日志信息的 WinForms 控件。 由于应该通过相同的机制显示异常,因此没有任何错误可见。

跨线程操作的解决方法可以看这里https://stackoverflow.com/a/925067/1817610

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2021-06-22
    • 2020-02-11
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多