所以我试图用一个简单的EasyNetQ消息架构来实验(基于这个EasyNetQ总体: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类型的消息并记录到文本文件“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类型的消息,并将其Text属性的值打印到日志文件"SubscriberLogFile.txt" . 问题是它没有登录到上面的文本文件 . 看起来我的Suscriber中的 HandleTextMessage 处理程序从未被调用过 . 这是"SubscriberLogFile.txt"的内容:
另外,查看RabbitMQ管理控制台,没有创建任何连接或通道,只有一个队列:
和RabbitMQ日志:
当我第一次做同样的实验时,但不同的是发布者和订阅者是控制台应用程序而不是Windows服务,事情似乎工作正常 . 这可能是什么问题?
1 回答
问题是我打开 Bus 车的时候正在处理 Bus 车 . 相反,它必须保持打开状态,只有在服务停止时才会在OnStop事件上处理 .