2

ActiveMQ サーバーに接続するための次のコードがあります。接続は機能し、コンシューマーは AMQ Web インターフェイスに表示され、キューにメッセージがありますが、OnMessage は実行されません。

開始コールを移動しようとしましたが、それは役に立ちません。TestConnection はクライアント ID & started を示します: true

キュー内のメッセージの数はゆっくりと減少し、Web インターフェイスによると、これを行っているのは私の消費者です。

デキューを示す 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に感謝します。

ここに示すコードに問題はありません。問題は、ログ情報を表示する WinForms コントロールとは別のスレッドで OnMethod が実行されることです。例外は同じメカニズムによって表示されるはずだったため、エラーは表示されませんでした。

クロススレッド操作の解決策は、https://stackoverflow.com/a/925067/1817610にあります。

于 2014-08-03T16:19:08.717 に答える