在ConcurrencyMode.Single模式下使用Tibco EMS WCF重复ACK

时间:2013-04-02 04:39:24

标签: .net wcf jms tibco tibco-ems

我们目前在设置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。队列中有多少消息似乎并不重要,如果长度大于1,它将始终双重确认。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在处理CLIENT_ACKNOWLEDGE时,看起来这只是Tibco与WCF组件的不良实现。由于会话对象是抽象的,因此您无法确认您无法访问的内容。

选项如下:

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

还有一个问题,如果你在没有ACK的情况下抛出异常,它将被卡在队列中。