我刚刚开始使用nservice总线,并试图让出版工作。我有一个听众,似乎缺少一些消息。它配置为

 <MsmqTransportConfig
  InputQueue="InformMessages"
  ErrorQueue="error"
  NumberOfWorkerThreads="5"
  MaxRetries="5"
 />

有趣的是,如果我将NumberOfWorkerThreads设置为1,它会一直错过其他所有消息。对于较大的值,似乎不那么确定。在我的消息处理程序中,我有

class MessageHandler : IMessageHandler<ICourseRegister>
{
    public void Handle(ICourseRegister message)
    {
        Console.WriteLine("Message dun got gotted");
        Console.WriteLine("Course name is: " + message.CourseName);
    }

    private IBus bus;
    public IBus Bus
    {
        set { this.bus = value; }
    }
}

并且总线配置为

        var bus = NServiceBus.Configure.With()
              .SpringBuilder()
              .XmlSerializer()
              .MsmqTransport()
                  .IsTransactional(true)
                  .PurgeOnStartup(false)
              .UnicastBus()
                  .ImpersonateSender(false)
                  .LoadMessageHandlers()
              .CreateBus()
              .Start();

是否有我需要做的事情和Handler的结束,以便它可以自由准备接收下一条消息或我需要做的一些配置,以便在处理程序繁忙时有一个客户端队列来保留消息。发送消息之间的时间似乎并不重要,可能是20秒,听众仍然没有收到所有消息。

有帮助吗?

解决方案

在看了你发送的解决方案后,我看到了问题所在。

您为两个进程指定了相同的输入队列 - 发布者和订阅者。因此,您有两个进程都在争夺消息(我认为)您打算只向订阅者发送消息。

为每个进程提供自己的输入队列,一切都应该与世界一致: - )

其他提示

如果你的工作方式类似于pub / sub样本,你可能会看到的是“多态订阅”。

在pub / sub示例中,发布者交替发布一个接口IEvent和一个具体的类EventMessage(继承IEvent)。

如果订阅者订阅了具体类,则它将不会收到接口消息。对于所有类型的层次结构都是如此,如果您订阅了特定的类,并且发布者发布了其基类类型的消息,则不会调度该消息。

多态订阅的作用相反。如果您订阅了基础,则发布者发布的任何子类都将到达。

这与线程无关。

希望有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top