想象一下以下设置:Silverlight客户端通过网络使用WCF服务通过网络传输序列化命令,WCF服务反过来将命令反序列化并使用NServiceBus将其发送到通用主机负责处理该命令。 WCF服务在发送命令时注册了一个要调用的回调函数。通用主机验证命令并返回错误代码(0 ==成功或> == ==失败)。Wcf服务正在等待NServiceBus的回复,永远不会到来
注意:WCF服务是在内置的WCF服务之后建模的。不同的是,这个WCF服务接收到一个'通用命令'(不是IMessage),将它反序列化为一个真正的命令(它实现了IMessage),然后将反序列化的命令发送到总线。
当发生意外异常时,该命令会在错误队列中排队(在一定数量的重试之后)。在这一点上,发起WCF服务坐在那里闲置,不知道刚刚发生的事情。稍后,Silverlight客户端将根据WCF客户端代理配置超时。
东西在我脑海中是模糊的:
- 不NServiceBus处理这种情况下以任何方式?什么时候抛出超时异常(如果有的话)?或者这对萨迦是独一无二的?
- 假设我使用[OperationContract(AsyncPattern = true)],是否有任何WCF相关的超时设置会终止服务操作?或者将EndXXX方法以某种方式称为?或者它会永远坐在那里,泄漏,等待永远不会来的东西?
方式进行:
- 重用现有的超时机制,提供的东西不漏。
- 在wcf服务和nservicebus之间构建我自己的超时机制。
- 当命令落在错误队列中时以某种方式通知wcf服务。
- 使用WCF服务层中的全面回调消息处理程序构建我自己的异步通知机制。
我做的事:
- 运行提供NServiceBus的例子。
- 尖刺的快乐案例。
对如何进行任何指导意见是值得欢迎的,是它的博客文章,邮件列表条目,...
一些动机采摘我目前的做法
- 我试图杠杆NServiceBus的一些可扩展性优势(在后期使用分发器)。
- 我不想承载一个gazillion WCF服务(每个命令一个),这就是为什么我制作了一个类似总线的WCF服务。
- 尽管这是一些请求/响应风格,但我最关心的是如何优雅地处理不经过的命令回复。
这不是一个昂贵的操作 - 当单独的过程处于负载状态时,我们可能需要等待一段时间,由于发生了意想不到的事情,我们可能得不到答案,但我们应该能够正常处理这些情况。 – 2010-09-15 07:15:49
你需要立即回应吗?您能否向用户显示适当的结果并稍后检查状态?很像这个网站,评论并没有真正承诺。如果您发表评论并刷新它就会消失。你能采取同样的方法吗? – 2010-09-15 13:19:14
我确实得到了“感谢您的命令,我们会尽快执行它”,当它完成后,我们会通过电子邮件发送给您。“ – 2010-09-15 14:56:07