2

我有以下代码连接到 ActiveMQ 服务器。连接有效,消费者在 AMQ Web 界面上可见,队列中有消息但 OnMessage 未执行。

我尝试移动启动呼叫,但这没有帮助。TestConnection 显示客户端 ID 和已启动:true

队列中的消息数量缓慢减少,根据 Web 界面,这是我的消费者正在执行此操作。

显示出队的网页界面

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);
            }
        }
    }
}
4

1 回答 1

3

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

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

跨线程操作的解决方案可以在这里找到https://stackoverflow.com/a/925067/1817610

于 2014-08-03T16:19:08.717 回答