2012-09-12 57 views
0

我有一个使用NServiceBus的ASP.Net WebAPI应用程序。命令从应用程序发送到运行NSB主机的后端服务器。服务器负责与数据库进行通信。NServiceBus回复消息警告

大多数命令都是“火再遗忘”。一个简单的Bus.Send(...)和Web客户端立即释放,以便操作可以异步发生。

唯一的例外是对于在数据库中创建新记录的命令。数据库负责生成新创建实体的ID,我需要将其返回给调用者。这是性能较差,因为来电者必须坚持,但在我的情况下这是一个可接受的打击。

我成功地使用这个Bus.Reply()功能,如记录全双工样本英寸我正在回复一条消息,该消息具有新生成的Id的单个属性。在网络方面,我使用任务延续(利用WebAPI的异步功能)以及使用.Register之后的Bus.Send()注册了回调。

这一切都工作得很好。它以一种非常直接和简单的方式完成我想要的。唯一的问题是,每一个由客户端收到响应消息时,它会记录一个警告如下:

2012-09-11 16:46:44,745 [Worker.26] WARN NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] - Failed raising 'transport message received' event for message with ID=1faee572-f904-4b09-b1d5-c0bd7c12738d\82936 
System.InvalidOperationException: No handlers could be found for message type: MyProject.Messages.MyEntityCreatedResponseMessage 
    at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg) 
    at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e) 
    at System.EventHandler`1.Invoke(Object sender, TEventArgs e) 
    at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg) 

我怎样才能摆脱这种警告?这里我不需要消息处理程序。

+0

关闭我的头顶 - 我认为你需要实现一个虚拟(空)处理程序。否则,MyEntityCreatedResponseMessage事件将以错误队列结尾 –

+0

假处理程序停止警告,但然后我收到另一个警告,说我正在做pub/sub没有事件...为什么它认为.Reply是被处理,如果我做了.Publish? –

+0

我发现如果我使用Bus.Return而不是Bus.Reply,那我可以完成我之后的任何错误或警告。不过,这只适用于我将新ID视为ErrorCode,而我的ID恰好是整数。如果我需要传递不同类型的ID或其他信息(如实际的错误代码),那么这将不起作用。 –

回答

2

我建议在服务器甚至在客户端(浏览器)创建的ID。这样,你的信息仍然可以被遗忘,你不需要同步任何东西。

如果你想用数据库驱动的IDS坚持,NServiceBus只增加开销。也可以直接从您的网站代码直接与数据库交谈并在那里添加重试。

+0

这将需要像GUID标识符。如果可能的话,我想坚持一个简单的自动递增整数。直接写入数据库而不是通过公共汽车将是一个选择,但它会绕过我的架构的其余部分,所以我不确定是否要走这条路线。真的,我只是希望回复消息不需要处理程序。 –

+1

没有说GUID必须用于将实体持久化到数据库。所有的GUID需要用于识别用于坚持实体和关联回复的消息。在这种情况下,GUID将由客户端创建。 – Rich

+1

@Matt,您不必为整个项目(或系统)使用相同的体系结构。如果架构正在阻碍最佳解决方案,那么它就是错误的架构。 只要想一下在同步呼叫期间会发生什么。 Web请求到达,被转换为MSMQ消息,消息被处理,回复被转换为MSMQ消息,虚拟消息到达并被处理,然后回复被发回到Web客户端。 所有这些开销,它有什么好处? –