/// <summary> /// Distributes the message to all bindings /// </summary> private async Task <RouterPublishResult> Distribute(MqClient sender, HorseMessage message) { RouterPublishResult result = RouterPublishResult.NoReceivers; foreach (Binding binding in Bindings) { bool oldWaitResponse = message.WaitResponse; bool sent = await binding.Send(sender, message); message.WaitResponse = oldWaitResponse; if (sent) { if (binding.Interaction != BindingInteraction.None) { result = RouterPublishResult.OkAndWillBeRespond; } else if (result == RouterPublishResult.NoReceivers) { result = RouterPublishResult.OkWillNotRespond; } } } return(result); }
/// <summary> /// Sends the message to only first binding /// </summary> private async Task <RouterPublishResult> OnlyFirst(MqClient sender, HorseMessage message) { int index = 0; bool sent; RouterPublishResult result = RouterPublishResult.NoReceivers; do { if (index >= Bindings.Length) { return(RouterPublishResult.NoReceivers); } Binding binding = Bindings[index]; sent = await binding.Send(sender, message); if (sent) { result = binding.Interaction != BindingInteraction.None ? RouterPublishResult.OkAndWillBeRespond : RouterPublishResult.OkWillNotRespond; } index++; }while (!sent); return(result); }
public async Task Handle(MqClient client, HorseMessage message, bool fromNode) { IRouter router = _server.FindRouter(message.Target); if (router == null) { await SendResponse(RouterPublishResult.Disabled, client, message); return; } RouterPublishResult result = await router.Publish(client, message); await SendResponse(result, client, message); }
/// <summary> /// Sends negative ack or failed response if client is pending ack or response /// </summary> private static Task SendResponse(RouterPublishResult result, MqClient client, HorseMessage message) { if (result == RouterPublishResult.OkAndWillBeRespond) { return(Task.CompletedTask); } bool positive = result == RouterPublishResult.OkWillNotRespond; if (message.WaitResponse) { HorseMessage response = positive ? message.CreateAcknowledge() : message.CreateResponse(HorseResultCode.NotFound); return(client.SendAsync(response)); } return(Task.CompletedTask); }