private static void OnRejection(Message message, IResponseCompletionSource context) { Exception rejection; switch (message.RejectionType) { case Message.RejectionTypes.GatewayTooBusy: rejection = new GatewayTooBusyException(); break; case Message.RejectionTypes.DuplicateRequest: return; // Ignore duplicates default: rejection = message.BodyObject as Exception; if (rejection == null) { if (string.IsNullOrEmpty(message.RejectionInfo)) { message.RejectionInfo = "Unable to send request - no rejection info available"; } rejection = new OrleansMessageRejectionException(message.RejectionInfo); } break; } context.Complete(Response.FromException(rejection)); }
public static void ResponseCallback(Message message, IResponseCompletionSource context) { if (message.Result != Message.ResponseTypes.Rejection) { try { var response = (Response)message.BodyObject; context.Complete(response); } catch (Exception exc) { // catch the exception and break the promise with it. context.Complete(Response.FromException(exc)); } } else { OnRejection(message, context); } }
private void SendRequestMessage(GrainReference target, Message message, IResponseCompletionSource context, InvokeMethodOptions options) { message.InterfaceType = target.InterfaceType; message.InterfaceVersion = target.InterfaceVersion; var targetGrainId = target.GrainId; var oneWay = (options & InvokeMethodOptions.OneWay) != 0; message.SendingGrain = CurrentActivationAddress.Grain; message.SendingActivation = CurrentActivationAddress.Activation; message.TargetGrain = targetGrainId; if (SystemTargetGrainId.TryParse(targetGrainId, out var systemTargetGrainId)) { // If the silo isn't be supplied, it will be filled in by the sender to be the gateway silo message.TargetSilo = systemTargetGrainId.GetSiloAddress(); message.TargetActivation = ActivationId.GetDeterministic(targetGrainId); } if (message.IsExpirableMessage(this.clientMessagingOptions.DropExpiredMessages)) { // don't set expiration for system target messages. message.TimeToLive = this.clientMessagingOptions.ResponseTimeout; } if (!oneWay) { var callbackData = new CallbackData(this.sharedCallbackData, context, message); callbacks.TryAdd(message.Id, callbackData); } else { context?.Complete(); } if (logger.IsEnabled(LogLevel.Trace)) { logger.Trace("Send {0}", message); } MessageCenter.SendMessage(message); }