我们已经开发出一个自定义WCF道其通过Websphere MQ。

我们已经创建了一道工厂:

public class MqChannelFactory : ChannelFactoryBase<IRequestChannel>

其返回的实例,我们通道:

public class MqRequestChannel : ChannelBase, IRequestChannel

连接到IBM MQ队管理是一个昂贵的运作。目前,我们这样做在道。OnOpen().

以下指导方针正确使用的渠道,我们是callign ChannelFactory.CreateChannel()每次我们需要一道,发送消息,那么呼叫的频道。Close().

我们的假设是,ChannelFactory进行汇集的渠道,以便当通道。Close()称,该通道实际上不是封闭的,而是返回到游泳池。但是,每次我们呼ChannelFactory.CreateChannel,一个新通道是被实例,并且当请求发送,昂贵的通道打开执行。

因此,问题:什么是最好的方法防止的通道正在打开每个请求?

一些选项,我们正在调查:

  • 反正是有通过配置可以指定道池应该采取地方吗?我们应该执行我们自己的渠道集中在我们的ChannelFactory?

  • 我们应该只保持我们的通道打开生活的应用,发送的所有请求通过它吗?

  • 我们应该执行昂贵的工作(连接到队列管理)中的通道的工厂,这是我们的高速缓存的使用寿命应用程序?

有帮助吗?

解决方案

真的没有硬性的规则作什么样的最好的选择。起初,我想说的可能是最简单的解决方案将是缓客户渠道的应用水平。根据您的执行情况,这可能需要一些同步的工作,顺便说一句.

你可以潜在游泳池的连接在ChannelFactory的水平。我是犹豫池整个频道(总是有一些复杂性有),但是你可以游泳池连接的内部和有渠道获得连接在需要时从游泳池举行的由它们的频道的工厂。

这的确有的优点是,ClientBase 已经缓存 ClientFactory实例。净3.0sp1,所以这可能会使其更易于应用程序码(如果使用的话)。

在缺点,但是,这可能会获得更难以实现 如果 终结点地址的信息,是需要打开连接到队列管理,因为你可能可以创建渠道对不同终端的地址从一个单一的ChannelFactory对象。有可能的,这意味着你会需要明确禁止这个,或者你的ChannelFactory执行可能会需要保持连接的多个游泳池内(每个终点的地址或类似的东西).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top