protected override void OnReceivedMessage(Message msg) { // Don't process messages that have already timed out if (msg.IsExpired) { this.MessagingTrace.OnDropExpiredMessage(msg, MessagingStatisticsGroup.Phase.Receive); return; } // Are we overloaded? if (this.overloadDetector.Overloaded) { MessagingStatisticsGroup.OnRejectedMessage(msg); Message rejection = this.MessageFactory.CreateRejectionResponse(msg, Message.RejectionTypes.GatewayTooBusy, "Shedding load"); this.messageCenter.TryDeliverToProxy(rejection); if (this.Log.IsEnabled(LogLevel.Debug)) { this.Log.LogDebug("Rejecting a request due to overloading: {Message}", msg.ToString()); } loadSheddingCounter.Increment(); return; } SiloAddress targetAddress = this.gateway.TryToReroute(msg); msg.SendingSilo = this.myAddress; if (targetAddress is null) { // reroute via Dispatcher msg.TargetSilo = null; msg.TargetActivation = default; msg.ClearTargetAddress(); if (SystemTargetGrainId.TryParse(msg.TargetGrain, out var systemTargetId)) { msg.TargetSilo = this.myAddress; msg.TargetGrain = systemTargetId.WithSiloAddress(this.myAddress).GrainId; msg.TargetActivation = ActivationId.GetDeterministic(msg.TargetGrain); } MessagingStatisticsGroup.OnMessageReRoute(msg); this.messageCenter.RerouteMessage(msg); } else { // send directly msg.TargetSilo = targetAddress; if (SystemTargetGrainId.TryParse(msg.TargetGrain, out var systemTargetId)) { msg.TargetGrain = systemTargetId.WithSiloAddress(targetAddress).GrainId; msg.TargetActivation = ActivationId.GetDeterministic(msg.TargetGrain); } this.messageCenter.SendMessage(msg); } }
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); }