void FMessageRouter::DispatchMessage( const IMessageContextRef& Context ) { if (Context->IsValid()) { TArray<IReceiveMessagesPtr> Recipients; // get recipients, either from the context... const TArray<FMessageAddress>& RecipientList = Context->GetRecipients(); if (RecipientList.Num() > 0) { for (int32 Index = 0; Index < RecipientList.Num(); Index++) { IReceiveMessagesPtr Recipient = ActiveRecipients.FindRef(RecipientList[Index]).Pin(); if (Recipient.IsValid()) { Recipients.AddUnique(Recipient); } else { ActiveRecipients.Remove(RecipientList[Index]); } } } // ... or from subscriptions else { FilterSubscriptions(ActiveSubscriptions.FindOrAdd(Context->GetMessageType()), Context, Recipients); FilterSubscriptions(ActiveSubscriptions.FindOrAdd(NAME_All), Context, Recipients); } // dispatch the message for (int32 RecipientIndex = 0; RecipientIndex < Recipients.Num(); RecipientIndex++) { IReceiveMessagesPtr Recipient = Recipients[RecipientIndex]; ENamedThreads::Type RecipientThread = Recipient->GetRecipientThread(); if (RecipientThread == ENamedThreads::AnyThread) { Tracer->TraceDispatchedMessage(Context, Recipient.ToSharedRef(), false); Recipient->ReceiveMessage(Context); Tracer->TraceHandledMessage(Context, Recipient.ToSharedRef()); } else { TGraphTask<FMessageDispatchTask>::CreateTask().ConstructAndDispatchWhenReady(RecipientThread, Context, Recipient, Tracer); } } } }
void FMessageBridge::ReceiveMessage( const IMessageContextRef& Context ) { if (!Enabled) { return; } // get remote nodes TArray<FGuid> RemoteNodes; if (Context->GetRecipients().Num() > 0) { RemoteNodes = AddressBook.GetNodesFor(Context->GetRecipients()); if (RemoteNodes.Num() == 0) { return; } } // forward message to remote nodes Transport->TransportMessage(Context, RemoteNodes); }
void FMessageBridge::ReceiveMessage( const IMessageContextRef& Context ) { if (!Enabled) { return; } TArray<FGuid> TransportNodes; if (Context->GetRecipients().Num() > 0) { TransportNodes = AddressBook.GetNodesFor(Context->GetRecipients()); if (TransportNodes.Num() == 0) { return; } } // forward message to transport nodes FMessageDataRef MessageData = MakeShareable(new FMessageData()); TGraphTask<FMessageSerializeTask>::CreateTask().ConstructAndDispatchWhenReady(Context, MessageData, Serializer.ToSharedRef()); Transport->TransportMessage(MessageData, Context->GetAttachment(), TransportNodes); }
void FMessageBridge::HandleTransportMessageReceived( const IMessageContextRef& Context, const FGuid& NodeId ) { if (!Enabled || !Bus.IsValid()) { return; } // discard expired messages if (Context->GetExpiration() < FDateTime::UtcNow()) { return; } // register newly discovered endpoints if (!AddressBook.Contains(Context->GetSender())) { AddressBook.Add(Context->GetSender(), NodeId); Bus->Register(Context->GetSender(), AsShared()); } // forward message to local bus Bus->Forward(Context, Context->GetRecipients(), FTimespan::Zero(), AsShared()); }