public virtual string AddMessageListener(Action <Message <T> > listener) { var request = TopicAddMessageListenerCodec.EncodeRequest(GetName(), false); DistributedEventHandler handler = m => TopicAddMessageListenerCodec.AbstractEventHandler.Handle(m, (item, time, uuid) => HandleMessageListener(item, time, uuid, listener)); return(Listen(request, m => TopicAddMessageListenerCodec.DecodeResponse(m).response, GetKey(), handler)); }
public virtual string AddMessageListener(Action<Message<T>> listener) { var request = TopicAddMessageListenerCodec.EncodeRequest(GetName(), IsSmart()); DistributedEventHandler handler = m => TopicAddMessageListenerCodec.EventHandler.HandleEvent(m, (item, time, uuid) => { HandleMessageListener(item, time, uuid, listener); }); return RegisterListener(request, m => TopicAddMessageListenerCodec.DecodeResponse(m).response, id => TopicRemoveMessageListenerCodec.EncodeRequest(GetName(), id), handler); }
private ValueTask HandleEventAsync(ClientMessage eventMessage, object state) { var sstate = ToSafeState <SubscriptionState <TopicEventHandlers <T> > >(state); async ValueTask HandleEventAsync(IData itemData, long publishTime, Guid memberId) { var member = Cluster.Members.GetMember(memberId); // that one is not lazy... var item = ToObject <T>(itemData); // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (var handler in sstate.Handlers) { // there is only one event type... await handler.HandleAsync(this, member, publishTime, item).CAF(); } } return(TopicAddMessageListenerCodec.HandleEventAsync(eventMessage, HandleEventAsync, LoggerFactory)); }
/// <inheritdoc /> public async Task <Guid> SubscribeAsync(Action <TopicEventHandlers <T> > handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } var handlers = new TopicEventHandlers <T>(); handle(handlers); var subscription = new ClusterSubscription( TopicAddMessageListenerCodec.EncodeRequest(Name, Cluster.IsSmartRouting), ReadSubscribeResponse, CreateUnsubscribeRequest, ReadUnsubscribeResponse, HandleEventAsync, new SubscriptionState <TopicEventHandlers <T> >(Name, handlers)); await Cluster.Events.InstallSubscriptionAsync(subscription).CAF(); return(subscription.Id); }
private static Guid ReadSubscribeResponse(ClientMessage responseMessage, object state) => TopicAddMessageListenerCodec.DecodeResponse(responseMessage).Response;
private ValueTask HandleEventAsync(ClientMessage eventMessage, object state) { return(TopicAddMessageListenerCodec.HandleEventAsync(eventMessage, HandleTopicEventAsync, state, LoggerFactory)); }