代码之家  ›  专栏  ›  技术社区  ›  Paul Hadfield

如何在控制台应用程序中创建发布服务器

  •  1
  • Paul Hadfield  · 技术社区  · 14 年前

    我刚开始使用nservicebus,并更新了pubsub示例以使用.NET 4.0框架。工作得很好。这在“nserviceus.host.exe”环境中运行一个发布服务器和两个订阅服务器,因此负责设置总线实例和执行任何相关订阅。这一切都很好(如您所料),但我现在正试图将发布服务器从运行在“nservicebus.host.exe”中转移到它自己的控制台应用程序中(最终,我希望发布来自某个网站的消息,因此这似乎是朝着这个方向迈出的一小步)。

    如果启动3个项目(我的控制台应用程序、sub1和sub2),它会在本地计算机上创建5个msmq,但不会创建endpoint.config…subscriptions q,而是创建一个通用的“nserviceus订阅”q。如果启用日志,我会看到myPublisherInputQueue有三条(已处理)完成消息,错误代码为0,而subscriptor1inputqueue和subscriber2inputqueue各有一个。这一切似乎都很好,但是如果我再发布消息,发布者似乎不会抛出任何错误,但是对于订阅者来说,没有任何消息能够做到这一点(他们只是坐在那里等待消息)。对于任何MQS,新消息或日志中都不会显示任何消息。

    很明显,我遗漏了一些步骤——控制台应用程序是否没有为订阅打开自己?如果是这样,需要采取什么步骤来做到这一点?当您在nservicebus.host.exe中宿主发布服务器时,我缺少哪些步骤?

    要创建控制台应用程序,我已完成以下操作:

    1. 在pubsub解决方案中,创建了一个控制台应用程序。
    2. 在控制台应用程序中添加了对mymessages、nservicebus.dll和nservicebus.core.dll的引用
    3. 从nservicebus网站上现有的pub代码和示例中,将以下代码添加到“main()”

    代码:

    IBus Bus = Configure.With()
                        .Log4Net()
                        .DefaultBuilder()
                        .MsmqSubscriptionStorage()
                        .XmlSerializer()
                        .MsmqTransport()
                        .UnicastBus()
                            .LoadMessageHandlers()
                        .CreateBus()
                        .Start();
    
    bool publishIEvent = true;
    do
    {
        Console.ReadLine();
        var eventMessage = publishIEvent ? Bus.CreateInstance<IEvent>() : new EventMessage();
    
        eventMessage.EventId = Guid.NewGuid();
        eventMessage.Time = DateTime.Now.Second > 30 ? (DateTime?)DateTime.Now : null;
        eventMessage.Duration = TimeSpan.FromSeconds(99999D);
    
        Bus.Send(eventMessage);
    
        Console.WriteLine("Published event with Id {0}.", eventMessage.EventId);
    
    } while (true);
    
    1. 使用现有“publisher”app.config的内容为新控制台应用程序创建了app.config。

    2. 为控制台应用程序项目的命令行参数添加了“nservicebus.integration”。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Udi Dahan    14 年前

    如果您查看日志,很可能是NserviceBus告诉您需要将发布服务器配置为事务性的。这样做的方法是在.msmqTransport()之后包含.ISTransactional(true)。