0

我有一个通过 netMsmqBinding (MSMQ3) 的 WCF 服务。服务代码不会在 WCF 事务控制下运行,因为服务中的某些操作没有事务能力并且无法回滚。据我了解,这意味着我没有得到任何有毒消息处理等的好处。所以一旦我的服务代码被调用,消息就永远不在队列中。

如果我的服务出现严重故障,我想防止进一步的消息丢失。所以我记录了刚刚失败的消息,然后引发了一个普通的异常(不是 FaultException)。与任何其他 WCF 服务绑定一样,我希望这会使通道(在本例中为 MSMQ 通道调度程序)发生故障,并且不会从队列中接收更多消息。

但我似乎无法让这种行为(没有双关语)起作用。无论我的服务代码是否引发异常,我都会继续将消息路由到服务。

我在这里错过了什么吗?netMsmqBinding 是否像 http 绑定一样为每个请求创建一个新通道?如果是这样,那么任何关于如何解决我的问题的想法将不胜感激。

4

1 回答 1

1

服务代码不在 WCF 事务控制下运行,因为服务中的某些操作不具备事务能力并且无法回滚。据我了解,这意味着我没有得到任何有毒消息处理等的好处。

事务控制在某种程度上取决于您。将 a 包裹TransactionScope在您想要事务性的代码周围。这样可以保证它是事务性的。如果您实现自定义代码,这是队列上的一个属性。或者,您可以通过每个队列单独启用 MSMQ 上的事务。

毒物队列不是自动的,实际上完全是一个单独的队列。当您检测到无效的消息并写入时,您写入它。

所以我记录了刚刚失败的消息,然后引发了一个普通的异常(不是 FaultException)。

从 MSMQ 接收时引发异常不起作用。它没有什么可以抛出异常的。这就是毒物队列发挥作用的地方。您写入毒物队列以指示发生了错误。

我在这里错过了什么吗?netMsmqBinding 是否像 http 绑定一样为每个请求创建一个新通道?

netMsmqBinding 确实为在服务器端读取的每条消息生成一个新线程,但写入 MSMQ 不会。每个通道生成一个单独的线程。

于 2012-08-27T20:04:48.650 回答