【发布时间】:2016-05-18 13:56:18
【问题描述】:
所以我正在尝试(基于此 EasyNetQ 教程:Quick Start - EasyNetQ)使用涉及发布者和订阅者的简单 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”中。问题是它似乎没有收到消息,因为它没有登录到上面的文本文件。看起来我的订阅者中的 HandleTextMessage 处理程序从未被调用过。这是“SubscriberLogFile.txt”的内容:
另外,查看 RabbitMQ 管理控制台,没有创建连接或通道,只有一个队列:
还有 RabbitMQ 日志:
当我第一次做同样的实验时,不同之处在于发布者和订阅者是控制台应用程序而不是 Windows 服务,一切似乎都很好。这可能是什么问题?
【问题讨论】:
-
如果您在接收器服务运行时多次重启发布者服务,您会看到什么?
-
我注意到的是,RabbitMQ管理控制台的Queues视图中的消息数量每次增加1,但是SubscriberLogFile仍然没有打印出消息内容。但是,我认为问题可能是我在我的 Publisher 中打开它后立即处理总线(包括连接和订阅)。这是与 RabbitMQ 教程的另一个不同之处。在用户在命令行中输入“退出”之前,总线一直保持打开状态。
-
是的 - 仅在服务 OnStop 事件中配置总线。