0

したがって、パブリッシャーとサブスクライバーを含む単純な EasyNetQ メッセージング アーキテクチャを使用して(この EasyNetQ toturial: Quick Start - EasyNetQに基づいて) 実験しようとしていますが、期待どおりに機能していないようです。パブリッシャーとサブスクライバーはどちらも Visual Studio 2015 の Windows サービス プロジェクトであり、それらの間で送信されるメッセージは、次のような単純なクラス ライブラリであるカスタム タイプ (TextMessage) のインスタンスです。

namespace Messaging.Messages
{
    public class TextMessage
    {
        public string Text { get; set; }
    }
}

私のパブリッシャーは次のようになります。

namespace Messaging.Publisher
{
    public partial class ReportService : ServiceBase
    {
        private Timer timer = null;

        public ReportService()
        {
            this.InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Library.WriteErrorLog("Report Publisher Service started");

            using (var bus = RabbitHutch.CreateBus("host=localhost"))
            {
                bus.Publish(new TextMessage
                {
                    Text = "Hello"
                });
            }
        }

        protected override void OnStop()
        {
            this.timer.Enabled = false;
            Library.WriteErrorLog("Test window service has stopped");
        }

    }
}

だから空想は何もありません。これは、タイプ TextMessage の 1 つのメッセージを発行し、テキスト ファイル「PublisherLogFile.txt」にログを記録するだけです。

namespace Messaging.Publisher
{
    public static class Library
    {
        public static void WriteErrorLog(string Message)
        {
            StreamWriter sw = null;

            try
            {
                 sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\PublisherLogFile.txt", true);                      
               sw.WriteLine(DateTime.Now.ToString(CultureInfo.InvariantCulture) + ": " + Message);
                 sw.Flush();
                 sw.Close();
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}

サブスクライバーは次のようになります。

namespace Messaging.Subscriber
{
    public partial class ReportSubscriberService : ServiceBase
    {
        public ReportSubscriberService()
        {
            this.InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            WriteErrorLog("Report Subscriber Service started");

            using (var bus = RabbitHutch.CreateBus("host=localhost"))
            {
                bus.Subscribe<TextMessage>("testId", HandleTextMessage);
            }
        }

        protected override void OnStop()
        {
            WriteErrorLog("Exiting Report Subscriber Service");
        }

        private static void HandleTextMessage(TextMessage textMessage)
        {
            WriteErrorLog("Got message: " + textMessage.Text);
        }

        private static void WriteErrorLog(string Message)
        {
            try
            {
                var sw = new     StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\SubscriberLogFile.txt", true);
                sw.WriteLine(DateTime.Now.ToString(CultureInfo.InvariantCulture) + ": " + Message);
                sw.Flush();
                sw.Close();
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}

また、非常にシンプルです。タイプ TextMessage のメッセージを受信し、テキスト属性の値をログ ファイル「SubscriberLogFile.txt」に出力するだけです。問題は、上記のテキスト ファイルにログが記録されないため、メッセージを受信して​​いないように見えることです。サブスクライバーのHandleTextMessageハンドラーが呼び出されないようです。「SubscriberLogFile.txt」の内容は次のとおりです。

SubscriberLogFile コンテンツ

また、RabbitMQ 管理コンソールを見ると、接続もチャネルも作成されておらず、1 つのキューのみが作成されています。

RabbitMQ 管理コンソールの概要

RabbitMQ 管理コンソールのキュー

そして、RabbitMQ ログ:

RabbitMQ ログ

私が最初に同じ実験を行ったとき、パブリッシャーとサブスクライバーが Windows サービスではなくコンソール アプリケーションであるという違いはありましたが、問題なく動作しているように見えました。ここで何が問題になる可能性がありますか?

4

1 に答える 1

1

問題は、開通してすぐにバスを処分していたことです。代わりに、開いたままにし、OnStop イベントでサービスが停止したときにのみ破棄する必要があります。

于 2016-05-19T19:56:18.877 に答える