したがって、パブリッシャーとサブスクライバーを含む単純な 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」の内容は次のとおりです。
また、RabbitMQ 管理コンソールを見ると、接続もチャネルも作成されておらず、1 つのキューのみが作成されています。
そして、RabbitMQ ログ:
私が最初に同じ実験を行ったとき、パブリッシャーとサブスクライバーが Windows サービスではなくコンソール アプリケーションであるという違いはありましたが、問題なく動作しているように見えました。ここで何が問題になる可能性がありますか?