我刚刚开始使用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秒,听众仍然没有收到所有消息。
答案 0 :(得分:5)
在看了你发送的解决方案后,我看到了问题所在。
您为两个进程指定了相同的输入队列 - 发布者和订阅者。因此,您有两个进程都在争夺消息(我认为)您打算只向订阅者发送消息。
为每个进程提供自己的输入队列,一切都应该与世界一致: - )
答案 1 :(得分:0)
如果您的工作类似于pub / sub示例,那么您可能会看到“多态订阅”。
在pub / sub示例中,发布者交替发布一个接口IEvent和一个具体的类EventMessage(继承IEvent)。
如果订阅者订阅了具体类,则它将不会收到接口消息。对于所有类型的层次结构都是如此,如果您订阅了特定的类,并且发布者发布了其基类类型的消息,则不会调度该消息。
多态订阅的作用相反。如果您订阅了基础,则发布者发布的任何子类都将到达。
这与线程无关。
希望有所帮助。