/// <summary> /// Triggers for queue events /// </summary> /// <param name="eventId">indicating the event id</param> /// <param name="eventArgs">indicating the event args</param> private void Queue_OnEvent(BrokerQueueEventId eventId, EventArgs eventArgs) { if (eventId == BrokerQueueEventId.AllRequestsProcessed) { // Handle the event in a seperate thread to avoid potential deadlock ThreadPool.QueueUserWorkItem( new ThreadHelper <object>(new WaitCallback(this.OnAllRequestsProcessed)).CallbackRoot ); } else if (eventId == BrokerQueueEventId.AllResponesDispatched || (this.sharedData.SessionFailed && eventId == BrokerQueueEventId.AvailableResponsesDispatched)) { if (eventId == BrokerQueueEventId.AvailableResponsesDispatched) { BrokerTracing.TraceEvent(System.Diagnostics.TraceEventType.Information, 0, "[BrokerClient] Client {0}: All available responses dispatched, send EndOfResponse message", this.clientId); } else { BrokerTracing.EtwTrace.LogBrokerClientAllResponseDispatched(this.sharedData.BrokerInfo.SessionId, this.clientId); } if (this.responsesClient != null) { this.responsesClient.EndOfResponses(eventId, (ResponseEventArgs)eventArgs); } } }
/// <summary> /// End of responses received /// </summary> /// <param name="eventId">indicating the event id</param> /// <param name="eventArgs">indicating the event args</param> public override void EndOfResponses(BrokerQueueEventId eventId, ResponseEventArgs eventArgs) { IResponseServiceCallback callback = (IResponseServiceCallback)(eventArgs.State as object[])[0]; string clientData = (eventArgs.State as object[])[1].ToString(); // if the broker fails and the last available response received, then append the session failure fault message let the client API to handle the failure gracefully. if (eventId == BrokerQueueEventId.AvailableResponsesDispatched) { this.ReplyFaultMessage(callback, FrontEndFaultMessage.GenerateFaultMessage(null, this.Version, SOAFaultCode.Broker_SessionFailure, SR.SessionFailure), clientData); } this.ReplyEndOfMessage(callback, clientData); }
/// <summary> /// Indicates EndOfResponses event has been triggered /// </summary> /// <param name="eventId">indicating the event id</param> public void EndOfResponses(BrokerQueueEventId eventId) { if (eventId == BrokerQueueEventId.AllResponesDispatched || (this.sharedData.SessionFailed && eventId == BrokerQueueEventId.AvailableResponsesDispatched)) { if (eventId == BrokerQueueEventId.AvailableResponsesDispatched) { this.GenerateFaultMessage(EndOfResponsesReason.ClientTimeout); } this.eom = true; this.completeEvent.Set(); } }
internal void DispatchEvent(BrokerQueueEventId eventId, EventArgs eventArgs) { if (this.OnEvent != null) { try { this.OnEvent(eventId, eventArgs); } catch (Exception e) { BrokerTracing.TraceWarning("[BrokerQueue] .DispatchEvent: the event handler raised exception, {0}", e); } } }
/// <summary> /// Informs that EndOfResponses has reached /// </summary> /// <param name="eventId">indicating the event id</param> /// <param name="eventArgs">indicating the event args</param> public override void EndOfResponses(BrokerQueueEventId eventId, ResponseEventArgs eventArgs) { this.result.EndOfResponses(eventId); }
/// <summary> /// Informs that EndOfResponses has reached /// </summary> /// <param name="eventId">indicating the event id</param> /// <param name="eventArgs">indicating the event args</param> public abstract void EndOfResponses(BrokerQueueEventId eventId, ResponseEventArgs eventArgs);