【问题标题】:EasyNetQ Windows Service messaging architecture not quite workingEasyNetQ Windows 服务消息传递架构无法正常工作
【发布时间】: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 事件中配置总线。

标签: c# .net rabbitmq easynetq


【解决方案1】:

问题是我一打开公共汽车就将其丢弃。相反,它必须保持打开状态,并且仅在服务停止时在 OnStop 事件中被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2014-08-11
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多