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));
        }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 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));
 }