Пример #1
0
        /// <summary>
        /// Put the response item objects into the storage.
        /// </summary>
        /// <param name="responses">A list of response objects</param>
        /// <param name="putResponseCallback">the callback function that will be called once the async operation finish or exception raise.</param>
        /// <param name="callbackState">the state object for the callback.</param>
        public void PutResponsesAsync(IEnumerable <BrokerQueueItem> responses, PutResponseCallback putResponseCallback, object callbackState)
        {
            int responseCount      = 0;
            int faultResponseCount = 0;

            foreach (BrokerQueueItem response in responses)
            {
                lock (this.lockResponseQueueField)
                {
                    this.responseQueueField.Enqueue(response);
                    Interlocked.Increment(ref this.responseCountField);
                }
                response.PeerItem.Dispose();
                response.PeerItem = null;
                if (response.Message.IsFault)
                {
                    faultResponseCount++;
                }
                responseCount++;
            }

            Interlocked.Add(ref this.failedRequestCountField, faultResponseCount);
            long remainingRequestCount = Interlocked.Add(ref this.requestCountField, -(responseCount));
            bool isLastResponse        = this.EOMReceived && (remainingRequestCount == 0);

            PutResponseComplete(responseCount, faultResponseCount, isLastResponse, putResponseCallback, callbackState);
        }
Пример #2
0
        /// <summary>
        /// Put on response item into persistence
        /// </summary>
        /// <param name="response">the response item to be persisted</param>
        /// <param name="putResponseCallback">the callback function that will be called once the async operation finish or exception raise.</param>
        /// <param name="callbackState">the state object for the callback.</param>
        public void PutResponseAsync(BrokerQueueItem response, PutResponseCallback putResponseCallback, object callbackState)
        {
            bool isFaultResponse = response.Message.IsFault;

            lock (this.lockResponseQueueField)
            {
                this.responseQueueField.Enqueue(response);
                Interlocked.Increment(ref this.responseCountField);
            }

            response.PeerItem.Dispose();
            response.PeerItem = null;

            if (isFaultResponse)
            {
                Interlocked.Increment(ref this.failedRequestCountField);
            }
            bool isLastResponse = (Interlocked.Decrement(ref this.requestCountField) == 0);

            PutResponseComplete(1, isFaultResponse ? 1 : 0, isLastResponse, putResponseCallback, callbackState);
        }
Пример #3
0
        /// <summary>
        /// the putting response complete thread proc
        /// </summary>
        /// <param name="state">the thread pool callback state</param>
        private static void PutResponseComplete(int responseCount, int faultResponseCount, bool isLastResponse, PutResponseCallback putResponseCallback, object callbackState)
        {
            if (putResponseCallback == null)
            {
                return;
            }

            try
            {
                putResponseCallback(null, responseCount, faultResponseCount, isLastResponse, null, callbackState);
            }
            catch (Exception e)
            {
                BrokerTracing.TraceError("[MemoryPersist] .PutResponseComplete: callback failed, Exception:{0}.", e.ToString());
            }
        }