internal void SendRejectionMessage(Message rejection) { if (rejection.Result == Message.ResponseTypes.Rejection) { Transport.SendMessage(rejection); rejection.ReleaseBodyAndHeaderBuffers(); } else { throw new InvalidOperationException( "Attempt to invoke Dispatcher.SendRejectionMessage() for a message that isn't a rejection."); } }
protected override void ProcessMessageAfterSend(Message msg, bool sendError, string sendErrorStr) { msg.ReleaseBodyAndHeaderBuffers(); if (sendError) { // We can't recycle the current message, because that might wind up with it getting delivered out of order, so we have to reject it FailMessage(msg, sendErrorStr); } }
protected override void FailMessage(Message msg, string reason) { msg.ReleaseBodyAndHeaderBuffers(); MessagingStatisticsGroup.OnFailedSentMessage(msg); if (MsgCenter.Running && msg.Direction == Message.Directions.Request) { if (Log.IsVerbose) Log.Verbose(ErrorCode.ProxyClient_RejectingMsg, "Rejecting message: {0}. Reason = {1}", msg, reason); MessagingStatisticsGroup.OnRejectedMessage(msg); Message error = msg.CreateRejectionResponse(Message.RejectionTypes.Unrecoverable, reason); MsgCenter.QueueIncomingMessage(error); } else { Log.Warn(ErrorCode.ProxyClient_DroppingMsg, "Dropping message: {0}. Reason = {1}", msg, reason); MessagingStatisticsGroup.OnDroppedSentMessage(msg); } }
protected override void OnMessageSerializationFailure(Message msg, Exception exc) { // we only get here if we failed to serialise the msg (or any other catastrophic failure). // Request msg fails to serialise on the sending silo, so we just enqueue a rejection msg. Log.Warn(ErrorCode.ProxyClient_SerializationError, String.Format("Unexpected error serializing message to gateway {0}.", Address), exc); FailMessage(msg, String.Format("Unexpected error serializing message to gateway {0}. {1}", Address, exc)); if (msg.Direction == Message.Directions.Request || msg.Direction == Message.Directions.OneWay) { return; } // Response msg fails to serialize on the responding silo, so we try to send an error response back. // if we failed sending an original response, turn the response body into an error and reply with it. msg.Result = Message.ResponseTypes.Error; msg.BodyObject = Response.ExceptionResponse(exc); try { MsgCenter.SendMessage(msg); } catch (Exception ex) { // If we still can't serialize, drop the message on the floor Log.Warn(ErrorCode.ProxyClient_DroppingMsg, "Unable to serialize message - DROPPING " + msg, ex); msg.ReleaseBodyAndHeaderBuffers(); } }