/// <summary> /// private constructor should only acces through Instance /// </summary> private CallbackManagerImpl() { this.publishMessageHandler = new PublishEventHandler(this.PublishMessageHandlerProc); this.publishSendResponseTicketHandler = new PublishEventHandler(PublishSendResponseTicketHandlerProc); publishThreadPool = new PublishThreadPool(); this.random = new Random(); }
/// <summary> /// /// </summary> /// <param name="clientProxy"></param> /// <param name="dpea"></param> /// <param name="publishHandler"></param> public void AddPublish(ClientProxy clientProxy, PublishEventArgs dpea, PublishEventHandler publishHandler) { if (clientProxy.PublishingThread == null) { lock (clientProxy) { if (clientProxy.PublishingThread == null) { lock (this.publishThreadList) { foreach (PublishThread curPublishThread in this.publishThreadList) { if (curPublishThread.ClientCount == 0) { clientProxy.PublishingThread = curPublishThread; break; } } if (clientProxy.PublishingThread == null) { PublishThread publishThread = null; if (this.publishThreadList.Count < MaxThreads) { publishThread = new PublishThread(this.publishThreadList.Count); this.publishThreadList.Add(publishThread); } else { int minClientCount = int.MaxValue; foreach (PublishThread curPublishThread in this.publishThreadList) { if (curPublishThread.ClientCount < minClientCount) { publishThread = curPublishThread; minClientCount = curPublishThread.ClientCount; } } } clientProxy.PublishingThread = publishThread; } } } } } clientProxy.PublishingThread.AddPublish(clientProxy, dpea, publishHandler); }
/// <summary> /// /// </summary> /// <param name="dpea"></param> /// <param name="publishHandler"></param> public void AddPendingMessage(PublishEventArgs dpea, PublishEventHandler publishHandler) { lock (this.pendingMessageList) this.pendingMessageList.Add(new KeyValuePair <PublishEventArgs, PublishEventHandler>(dpea, publishHandler)); }
private void Publish(Dictionary <Guid, ClientProxy> targetClientProxyMap, bool isMapPrivateCopy, PublishEventArgs dpea, PublishEventHandler publishHandler) { DateTime messageTime = DateTime.UtcNow; List <ClientProxy> tmpSubscribersList; if (isMapPrivateCopy == false) { lock (targetClientProxyMap) tmpSubscribersList = new List <ClientProxy>(targetClientProxyMap.Values); } else { tmpSubscribersList = new List <ClientProxy>(targetClientProxyMap.Values); } //not going to call the publish in the same order //each time so that one subscriber does not get precedence //with network and other things between the server and //the client this might not matter, but we will do our best //to make sure we are fair int randomNum = this.GetRandomNumber(); int startIndex = randomNum % tmpSubscribersList.Count; int incrament = (randomNum % 2 == 0) ? 1 : -1; int randomIndex = startIndex; for (int subscriberIndex = 0; subscriberIndex < tmpSubscribersList.Count; subscriberIndex++) { this.publishThreadPool.AddPublish(tmpSubscribersList[randomIndex], dpea, publishHandler); randomIndex += incrament; if (randomIndex < 0) { randomIndex = tmpSubscribersList.Count - 1; } else if (randomIndex >= tmpSubscribersList.Count) { randomIndex = 0; } } }
/// <summary> /// /// </summary> /// <param name="clientProxy"></param> /// <param name="dpea"></param> /// <param name="publishHandler"></param> public PublishParameters(ClientProxy clientProxy, PublishEventArgs dpea, PublishEventHandler publishHandler) { this.ClientProxy = clientProxy; this.PublishEventArg = dpea; this.PublishHandler = publishHandler; }
/// <summary> /// /// </summary> /// <param name="clientProxy"></param> /// <param name="dpea"></param> /// <param name="publishHandler"></param> public void AddPublish(ClientProxy clientProxy, PublishEventArgs dpea, PublishEventHandler publishHandler) { this.waitQueue.Enqueue(new PublishParameters(clientProxy, dpea, publishHandler)); }