首页 文章

EasyNetQ Windows服务消息传递架构不太有用

提问于
浏览
0

所以我试图用一个简单的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"的内容:

SubscriberLogFile content

另外,查看RabbitMQ管理控制台,没有创建任何连接或通道,只有一个队列:

RabbitMQ Management console overview

RabbitMQ Management console queues

和RabbitMQ日志:

RabbitMQ log

当我第一次做同样的实验时,但不同的是发布者和订阅者是控制台应用程序而不是Windows服务,事情似乎工作正常 . 这可能是什么问题?

1 回答

  • 1

    问题是我打开 Bus 车的时候正在处理 Bus 车 . 相反,它必须保持打开状态,只有在服务停止时才会在OnStop事件上处理 .

相关问题