/// <summary>
/// Returns a MessageStreamListener instance based on this instance's configuratino (timeout, bucket name etc.)
///
/// When multiple listeners are requested with the exact same parameters (usually when multiple clients are instantiated from the same configuration),
/// the same listener will be returned each time.
/// </summary>
/// <returns></returns>
private MessageStreamListener GetPooledListener()
{
// create a unique key based on the parameters
// to find out if we already have a listener attached to this sockIOPool
var hcc = new HashCodeCombiner();
hcc.Add(this.Timeout);
hcc.Add(this.DeadTimeout);
hcc.Add(this.RetryCount);
hcc.Add(this.RetryTimeout.GetHashCode());
hcc.Add(this.bucketName.GetHashCode());
if (credential != null)
{
hcc.Add((this.credential.UserName ?? String.Empty).GetHashCode());
hcc.Add((this.credential.Password ?? String.Empty).GetHashCode());
hcc.Add((this.credential.Domain ?? String.Empty).GetHashCode());
}
for (var i = 0; i < this.poolUrls.Length; i++)
{
hcc.Add(this.poolUrls[i].GetHashCode());
}
var hash = hcc.CurrentHash;
MessageStreamListener retval;
lock (ListenerSync)
if (listeners.TryGetValue(hash, out retval))
{
listenerRefs[retval].RefCount++;
retval.Subscribe(this.HandleMessage);
}
else
{
var name = this.bucketName;
// create a new listener for the sockIOPool urls
retval = new MessageStreamListener(poolUrls, (client, root) => ResolveBucketUri(client, root, name));
retval.Timeout = this.Timeout;
retval.DeadTimeout = this.DeadTimeout;
retval.Credentials = this.credential;
retval.RetryCount = this.RetryCount;
retval.RetryTimeout = this.RetryTimeout;
retval.Subscribe(this.HandleMessage);
listeners[hash] = retval;
listenerRefs[retval] = new ListenerInfo {
RefCount = 1, HashKey = hash
};
retval.Start();
}
return(retval);
}