public void AddResponseQueues(string clientData, int sessionHash) { lock (this.dicSyncLock) { if (!this.responseMessageClients.Keys.Contains(sessionHash)) { string responseStorageName = SoaHelper.GetResponseStorageName(this.clusterHash, this.SessionId, sessionHash); CloudQueue responseQueue = this.queueClient.GetQueueReference(responseStorageName); CreateQueueWithRetry(responseQueue); if (this.SessionId == SessionStartInfo.StandaloneSessionId) { responseQueue.Clear(); } // use default retry option for the cloud queue CloudBlobContainer responseBlobContainer = this.blobClient.GetContainerReference(responseStorageName); CreateContainerWithRetry(responseBlobContainer); // use default retry option for the cloud blob SharedAccessQueuePolicy queuePolicy = new SharedAccessQueuePolicy() { Permissions = SharedAccessQueuePermissions.ProcessMessages, SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7) }; string responseQueueUri = string.Join(string.Empty, responseQueue.Uri, responseQueue.GetSharedAccessSignature(queuePolicy)); SharedAccessBlobPolicy blobPolicy = new SharedAccessBlobPolicy() { Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Delete, SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7) }; string responseBlobUri = string.Join(string.Empty, responseBlobContainer.Uri, responseBlobContainer.GetSharedAccessSignature(blobPolicy)); this.responseMessageClients.Add(sessionHash, Tuple.Create(new ConcurrentQueue <Message>(), new AzureStorageClient(responseQueue, responseBlobContainer))); this.responseClientUris.Add(sessionHash, Tuple.Create(responseQueueUri, responseBlobUri)); } if (!this.sessionClientData.Keys.Contains(clientData)) { this.sessionClientData.Add(clientData, sessionHash); } } }
/// <summary> /// Create message retriever to monitor the response queue and gets /// messages from it. /// </summary> /// <param name="jobId">job Id</param> /// <param name="jobRequeueCount">job re-queue count</param> /// <returns>response storage name</returns> public string Start(string jobId, int jobRequeueCount) { string responseStorageName = SoaHelper.GetResponseStorageName(this.clusterId.ToString(), jobId, jobRequeueCount); ResponseQueueManager manager = this.responseQueueManagers.GetOrAdd( responseStorageName, (key) => { BrokerTracing.TraceVerbose( "[AzureQueueManager].Start: Create the ResponseQueueManager, job requeue count {0}, {1}", key, responseStorageName); return(new ResponseQueueManager(this, this.sessionId, responseStorageName, this.StorageConnectionString)); }); // Following method only start manager once. manager.Start(); return(responseStorageName); }