1

我们目前有一个问题,我们已将 WCF 服务设置为连接到 tibco EMS 服务器。在单实例模式下运行服务时(由于应用程序的运行方式,我们无法更改此设置)它总是会首先确认 2 条消息,即使它只处理了一条 - 这会导致一些消息被跳过。

[ServiceBehavior(
    ConcurrencyMode = ConcurrencyMode.Single,
    InstanceContextMode = InstanceContextMode.Single,
    Namespace = "http://tempuri.org/test")]
public class MyService : IMyService

我已经逐步浏览了 Tibco EMS WCF 代码,可以看到私有 _deliveredList 字段中的底层 TIBCO.EMS.Session 类中有 2 条消息,即使我只处理了一条消息,它们都标记为需要 ACK。队列上有多少消息似乎并不重要,如果长度大于一,它总是会双重确认。

我使用以下配置应用了限制,但它似乎对发送的初始消息数量没有任何影响。

任何帮助将不胜感激。

4

1 回答 1

1

看起来这只是 Tibco 在处理 CLIENT_ACKNOWLEDGE 时使用 WCF 组件实现的一个糟糕的实现。由于会话对象是抽象的,因此您无法真正确认您无权访问的内容。

选项如下:

  • 将队列上的预取设置设置为 1
  • 使用 EXPLICIT_CLIENT_ACKNOWLEDGE

还有一个陷阱,如果您在没有 ACK 的情况下抛出异常,它将卡在队列中。

于 2013-04-14T03:08:17.140 回答