he Pool Manager described in the first part of this article series had a couple
of problems. The process of acquiring a pooled object was not transparent to
the client, which couldn’t simply new the object (provided that the required
type had been registered in the remote configuration file). The client had to
contact the broker explicitly to acquire a reference to an object in the pool.
The second problem lies in the fact that objects returned by the broker are
CAO types. This is far from optimal. The client must explicitly release the
object when done with the object calling Dispose. If it fails to do so, the
object is returned to the pool only when the object Lease time is expired.
Properly designed pooled objects don’t keep any client specific state across
calls, thus for this reason it would be highly desirable to pass back to clients
SAO SingleCall object types. This optimize the pool management, not letting
the client hold a reference to a pooled object longer than necessary.
Activation Transparency and
SingleCall Behavior via a Custom Channel Sink
Remoting behavior can be customized in two ways: defining a custom proxy
or inserting a custom sink in the default sink chain. The custom proxy
approach is not so compelling, since you cannot insert a custom proxy transparently
(the client must explicitly create it) and anything you can do with a custom
proxy can actually be done using a custom sink.
We will then opt for a custom sink to enable transparent activation and SingleCall
behavior for our pooled objects. The solution we will come out with won’t work
for Client Activated objects, but as I said, CAO are not a desirable option
when working with pooled objects.
Anyway, note you still can get CAO behaving objects when accessing the Pool
Custom Sinks and
Custom Sink Providers
Setting up a custom sink requires the development of two classes: the custom
sink class itself and a custom sink provider class. The latter has
to be registered into the remoting infrastructure. The sole role of the sink
provider is to return to the remoting infrastructure an instance of its associated
custom sink when required.
Here is a remote configuration file where a custom sink provider is registered
before the formatter