public async Task<StreamSubscriptionHandle<int>> Resume(StreamSubscriptionHandle<int> handle)
        {
            logger.Info("Resume");
            if(handle == null)
                throw new ArgumentNullException("handle");

            // new counter for this subscription
            Tuple<Counter,Counter> counters;
            if (!consumedMessageCounts.TryGetValue(handle, out counters))
            {
                counters = Tuple.Create(new Counter(), new Counter());
            }

            int countCapture = consumerCount;
            consumerCount++;
            // subscribe
            StreamSubscriptionHandle<int> newhandle = await handle.ResumeAsync(
                (e, t) => OnNext(e, t, countCapture, counters.Item1),
                e => OnError(e, countCapture, counters.Item2));

            // track counter
            consumedMessageCounts[newhandle] = counters;

            // return handle
            return newhandle;

        }
 public async Task BecomeConsumer(Guid streamId, string streamNamespace, string providerToUse)
 {
     logger.Info("BecomeConsumer");
     IStreamProvider streamProvider = GetStreamProvider(providerToUse);
     consumer = streamProvider.GetStream<int>(streamId, streamNamespace);
     consumerHandle = await consumer.SubscribeAsync(OnNextAsync, OnErrorAsync, OnActivateAsync);
 }
 public async Task StopConsuming()
 {
     logger.Info("StopConsuming");
     if (consumerHandle != null)
     {
         await consumerHandle.UnsubscribeAsync();
         consumerHandle = null;
     }
 }
 public override Task OnActivateAsync()
 {
     logger = base.GetLogger("FaultableConsumerGrain " + base.IdentityString);
     logger.Info("OnActivateAsync");
     eventsConsumedCount = 0;
     errorsCount = 0;
     eventsFailedCount = 0;
     consumerHandle = null;
     failPeriodTimer = null;
     return TaskDone.Done;
 }
Example #5
0
        public async Task Join()
        {
            subscription = await room.SubscribeAsync<ChatRoomMessage>((msg, token) =>
            {
                if (msg.User != UserName)
                    Console.WriteLine(msg.Text);

                return TaskDone.Done;
            });

            await user.Tell(new Join {Room = RoomName});
        }
        public async Task Subscribe()
        {
            var ccGrain = GrainFactory.GetGrain<IDataGrain>(0);
            //var stream = await ccGrain.GetStream();
            //_handler = await stream.SubscribeAsync(this, new SimpleSequenceToken(0));

            //var details = await ccGrain.GetStreamDetails();
            //var providerName = details.Item1;
            //var nameSpace = details.Item2;
            //var guid = details.Item3;

            //var provider = GrainClient.GetStreamProvider(providerName);
            //var stream = provider.GetStream<int>(guid, nameSpace);
            var stream = await ccGrain.GetStream();
            _handler = await stream.SubscribeAsync(this, null);
        }
        public async Task<StreamSubscriptionHandle<int>> Resume(StreamSubscriptionHandle<int> handle)
        {
            logger.Info("Resume");
            if(handle == null)
                throw new ArgumentNullException("handle");

            // new counter for this subscription
            Counter count;
            if(!consumedMessageCounts.TryGetValue(handle, out count))
            {
                count = new Counter();
            }

            // subscribe
            StreamSubscriptionHandle<int> newhandle = await handle.ResumeAsync((e, t) => count.Increment());

            // track counter
            consumedMessageCounts[newhandle] = count;

            // return handle
            return newhandle;

        }
Example #8
0
 //Jerk_ConsumerGrai would unsubscrube on any subscription added to it
 private async Task OnAdd(StreamSubscriptionHandle <int> handle)
 {
     await handle.UnsubscribeAsync();
 }
        private async Task<bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, StreamSubscriptionHandle<int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var numConsumed = await consumer.GetNumberConsumed();
            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                if (handler != null)
                {
                    var numHandlerConsumed = numConsumed[handler];
                    Assert.AreEqual(numProduced, numHandlerConsumed, "Producer and consumer do not match");
                }
                else
                {
                    foreach (int consumed in numConsumed.Values)
                    {
                        Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                    }
                }
            }
            else if (numProduced <= 0 || // no events produced?
                     consumerCount != numConsumed.Count || // subscription counts are wrong?
                     handler == null ? numConsumed.Values.All(consumedCount => consumedCount != numProduced) : numConsumed[handler] != numProduced) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced <= 0)
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                        consumerCount, numConsumed.Count);
                }
                foreach (int consumed in numConsumed.Values)
                {
                    if (numProduced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                            numProduced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return false;
            }

            if (handler != null)
            {
                _logger.Info("All counts are equal. numProduced = {0}, numHandlerConsumed = {1}, consumersCount = {2}", numProduced, numConsumed[handler], consumerCount); //Utils.DictionaryToString(numConsumed));    
            }
            else
            {
                _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));    
            }
         
            return true;
        }
        public async Task SubscribeToStream(Guid guid, string providerName)
        {
            var stream = GetStreamProvider(providerName).GetStream <StreamImmutabilityTestObject>(guid, "Namespace");

            _streamSubscriptionHandle = await stream.SubscribeAsync(OnNextAsync);
        }
Example #11
0
 //Jerk_ConsumerGrai would unsubscrube on any subscription added to it
 public async Task OnSubscribed(StreamSubscriptionHandle <int> handle)
 {
     await handle.UnsubscribeAsync();
 }
        public async Task StopConsuming(StreamSubscriptionHandle<int> handle)
        {
            logger.Info("StopConsuming");
            // unsubscribe
            await handle.UnsubscribeAsync();

            // stop tracking event count for stream
            consumedMessageCounts.Remove(handle);
        }
 protected internal StreamSubscription(StreamSubscriptionHandle<object> handle)
 {
     this.handle = handle;
 }
Example #14
0
        internal async Task IncomingMessage(NList message)
        {
            try
            {
                int   message_id   = message.Get <int>(0);
                NList dispatch_msg = message.GetRange(1, message.Count - 1);

                if (message_id == SystemMsg.CLIENT.ACCESS_TOKEN && !Access)
                {
                    string       access_token = dispatch_msg.Get <string>(0);
                    IAccessToken token        = _ClusterClient.GetGrain <IAccessToken>(access_token);
                    Guid         user_id      = await token.GetUserId();

                    if (user_id == Guid.Empty)
                    {
                        await OutcomingMessage(NList.New().Add(SystemMsg.SERVER.ACCESS_TOKEN).Add(false));

                        return;
                    }

                    _PlatformAccount = _ClusterClient.GetGrain <IUserAccount>(user_id);
                    IReadOnlyList <Role> roles = await _PlatformAccount.GetRoles();

                    if (roles == null)
                    {
                        await OutcomingMessage(NList.New().Add(SystemMsg.SERVER.ACCESS_TOKEN).Add(false));

                        return;
                    }

                    Access = true;
                    await OutcomingMessage(NList.New().Add(SystemMsg.SERVER.ACCESS_TOKEN).Add(true).Add(JsonConvert.SerializeObject(roles)));
                }
                else if (message_id == SystemMsg.CLIENT.CREATE_ROLE && Access)
                {
                    int    realm = dispatch_msg.Get <int>(0);
                    string json  = dispatch_msg.Get <string>(1);
                    Role   role  = await _PlatformAccount.CreateRole(realm, json);

                    if (role != null)
                    {
                        await OutcomingMessage(NList.New().Add(SystemMsg.SERVER.CREATE_ROLE).Add(true).Add(JsonConvert.SerializeObject(role)));
                    }
                    else
                    {
                        await OutcomingMessage(NList.New().Add(SystemMsg.SERVER.CREATE_ROLE).Add(false));
                    }
                }
                else if (message_id == SystemMsg.CLIENT.SELECT_ROLE && Access && !Inited)
                {
                    long role_id = dispatch_msg.Get <long>(0);
                    if (!await _PlatformAccount.HasRole(role_id))
                    {
                        return;
                    }

                    RoleAgent = _ClusterClient.GetGrain <IRoleAgent>(role_id);
                    await RoleAgent.BindSession(_PlatformAccount.GetPrimaryKey(), Protocol.ToString());

                    _AgentObserver = new AgentObserver(this);
                    var stream = _ClusterClient.GetStreamProvider(StreamProviders.AgentProvider).GetStream <NList>(_PlatformAccount.GetPrimaryKey(), Protocol.ToString());
                    _SubscriptionHandle = await stream.SubscribeAsync(_AgentObserver);

                    await RoleAgent.SendEntities();

                    Inited = true;
                }
                else if (message_id == SystemMsg.CLIENT.ONLINE && Inited)
                {
                    if (RoleAgent != null)
                    {
                        await RoleAgent.Online();
                    }
                }
                else if (Inited)
                {
                    if (RoleAgent != null)
                    {
                        await RoleAgent.OnResponse(message_id, dispatch_msg);
                    }
                }
            }
            catch (Exception ex)
            {
                _Logger.LogError(ex, "IncomingMessage Failed!");
            }
        }
        public async Task PubSubStoreRetrievalTest()
        {
            //var strmId = Guid.NewGuid();
            var strmId = Guid.Parse("761E3BEC-636E-4F6F-A56B-9CC57E66B712");

            var streamProv            = _client.GetStreamProvider("SMSProvider");
            IAsyncStream <int> stream = streamProv.GetStream <int>(strmId, "test1");

            //IAsyncStream<int> streamIn = streamProv.GetStream<int>(strmId, "test1");

            for (int i = 0; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }

            StreamSubscriptionHandle <int> handle = await stream.SubscribeAsync(
                (e, t) =>
            {
                Console.WriteLine(string.Format("{0}{1}", e, t));
                return(Task.CompletedTask);
            },
                e => { return(Task.CompletedTask); });


            for (int i = 100; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }


            StreamSubscriptionHandle <int> handle2 = await stream.SubscribeAsync(
                (e, t) =>
            {
                Console.WriteLine(string.Format("2222-{0}{1}", e, t));
                return(Task.CompletedTask);
            },
                e => { return(Task.CompletedTask); });

            for (int i = 1000; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }

            var sh = await stream.GetAllSubscriptionHandles();

            Assert.Equal(2, sh.Count);

            IAsyncStream <int> stream2 = streamProv.GetStream <int>(strmId, "test1");

            for (int i = 10000; i < 25; i++)
            {
                await stream2.OnNextAsync(i);
            }

            StreamSubscriptionHandle <int> handle2More = await stream2.SubscribeAsync(
                (e, t) =>
            {
                Console.WriteLine(string.Format("{0}{1}", e, t));
                return(Task.CompletedTask);
            },
                e => { return(Task.CompletedTask); });

            for (int i = 10000; i < 25; i++)
            {
                await stream2.OnNextAsync(i);
            }
        }
Example #16
0
 public async Task RemoveConsumer(Guid streamId, string providerName, StreamSubscriptionHandle <T> subsHandle)
Example #17
0
 public override Task OnActivateAsync()
 {
     logger.Info("OnActivateAsync");
     ConsumerHandle = null;
     return(Task.CompletedTask);
 }
        private async Task<bool> CheckCounter(IBatchProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer,
            StreamSubscriptionHandle<int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var consumers = await consumer.GetNumberConsumed();
            var numConsumed = consumers[handler];
            
            _logger.Info("Checking now for handler for stream: {0}", handler.StreamIdentity.ToString());

            return await CheckCounter(numProduced, numConsumed, assertIsTrue);
        }
Example #19
0
 public override Task OnActivateAsync(CancellationToken cancellationToken)
 {
     logger.LogInformation("OnActivateAsync");
     ConsumerHandle = null;
     return(Task.CompletedTask);
 }
Example #20
0
 protected internal StreamSubscription(StreamSubscriptionHandle <object> handle)
 {
     this.handle = handle;
 }
Example #21
0
 public ExternalStreamSubscriptionHandle(StreamSubscriptionHandle <T> handle)
 {
     this.handle = handle;
 }
Example #22
0
 public override bool Equals(StreamSubscriptionHandle <T> other)
 {
     return(this.handle.Equals(other));
 }
Example #23
0
 public override bool Equals(StreamSubscriptionHandle <T> other)
 {
     throw new NotImplementedException();
 }
Example #24
0
        public async Task RemoveConsumer(Guid streamId, string streamNamespace, string providerName, StreamSubscriptionHandle <int> subsHandle)
        {
            if (logger.IsVerbose)
            {
                logger.Verbose("RemoveConsumer StreamId={0} StreamProvider={1}", streamId, providerName);
            }
            if (State.ConsumerSubscriptionHandles.Count == 0)
            {
                throw new InvalidOperationException("Not a Consumer");
            }
            await subsHandle.UnsubscribeAsync();

            Observers.Remove(subsHandle);
            State.ConsumerSubscriptionHandles.Remove(subsHandle);
            await WriteStateAsync();
        }
Example #25
0
 protected internal StreamSubscription(StreamRef <TItem> stream, StreamSubscriptionHandle <TItem> handle, Guid?id = null)
 {
     this.handle = handle;
     Stream      = stream;
     Id          = id ?? handle.HandleId;
 }
        public async Task<StreamSubscriptionHandle<int>> Resume(StreamSubscriptionHandle<int> handle)
        {
            logger.Info("Resume");
            if(handle == null)
                throw new ArgumentNullException("handle");

            // new counter for this subscription
            Counter count;
            if(!consumedMessageCounts.TryGetValue(handle, out count))
            {
                count = new Counter();
            }

            // subscribe
            StreamSubscriptionHandle<int> newhandle = await handle.ResumeAsync((e, t) =>
            {
                logger.Info("Got next event {0}", e);
                string contextValue = RequestContext.Get(SampleStreaming_ProducerGrain.RequestContextKey) as string;
                if (!String.Equals(contextValue, SampleStreaming_ProducerGrain.RequestContextValue))
                {
                    throw new Exception(String.Format("Got the wrong RequestContext value {0}.", contextValue));
                }
                count.Increment();
                return TaskDone.Done;
            });

            // track counter
            consumedMessageCounts[newhandle] = count;

            // return handle
            return newhandle;

        }
        private async Task <bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, StreamSubscriptionHandle <int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                if (handler != null)
                {
                    var numHandlerConsumed = numConsumed[handler];
                    Assert.AreEqual(numProduced, numHandlerConsumed, "Producer and consumer do not match");
                }
                else
                {
                    foreach (int consumed in numConsumed.Values)
                    {
                        Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                    }
                }
            }
            else if (numProduced <= 0 ||                                                                                                            // no events produced?
                     consumerCount != numConsumed.Count ||                                                                                          // subscription counts are wrong?
                     handler == null ? numConsumed.Values.All(consumedCount => consumedCount != numProduced) : numConsumed[handler] != numProduced) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced <= 0)
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                                 consumerCount, numConsumed.Count);
                }
                foreach (int consumed in numConsumed.Values)
                {
                    if (numProduced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                                     numProduced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return(false);
            }

            if (handler != null)
            {
                _logger.Info("All counts are equal. numProduced = {0}, numHandlerConsumed = {1}, consumersCount = {2}", numProduced, numConsumed[handler], consumerCount); //Utils.DictionaryToString(numConsumed));
            }
            else
            {
                _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));
            }

            return(true);
        }
Example #28
0
 public StreamSubscription(StreamSubscriptionHandle<object> handle)
 {
     this.handle = handle;
 }
Example #29
0
 public override bool Equals(StreamSubscriptionHandle <T> other)
 {
     return(ReferenceEquals(this, other));
 }
 public async Task SubscribeToStream(Guid guid, string providerName)
 {
     var stream = GetStreamProvider(providerName).GetStream<StreamImmutabilityTestObject>(guid, "Namespace");
     _streamSubscriptionHandle = await stream.SubscribeAsync(OnNextAsync);
 }
Example #31
0
        public async Task PubSubStoreRetrievalTest()
        {
            //var strmId = Guid.NewGuid();
            var strmId = Guid.Parse("761E3BEC-636E-4F6F-A56B-9CC57E66B712");

            var streamProv            = GrainClient.GetStreamProvider("SMSProvider");
            IAsyncStream <int> stream = streamProv.GetStream <int>(strmId, "test1");

            //IAsyncStream<int> streamIn = streamProv.GetStream<int>(strmId, "test1");


            for (int i = 0; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }


            StreamSubscriptionHandle <int> handle = await stream.SubscribeAsync(
                (e, t) =>
            {
                Trace.WriteLine(string.Format("{0}{1}", e, t));
                return(TaskDone.Done);
            },
                e => { return(TaskDone.Done); });

            //StreamSubscriptionHandle<int> handleIn = await streamIn.SubscribeAsync(
            //    (e, t) =>
            //    {
            //        Trace.WriteLine(string.Format("{0}{1}", e, t));
            //        return TaskDone.Done;
            //    },
            //    e => { return TaskDone.Done; });

            //await handle.ResumeAsync(
            //    (e, t) =>
            //    {
            //        Trace.WriteLine(string.Format("{0}{1}", e, t));
            //        return TaskDone.Done;
            //    },
            //    e => { return TaskDone.Done; });



            for (int i = 100; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }


            StreamSubscriptionHandle <int> handle2 = await stream.SubscribeAsync(
                (e, t) =>
            {
                Trace.WriteLine(string.Format("2222-{0}{1}", e, t));
                return(TaskDone.Done);
            },
                e => { return(TaskDone.Done); });

            for (int i = 1000; i < 25; i++)
            {
                await stream.OnNextAsync(i);
            }

            //await handle2.ResumeAsync(
            //    (e, t) =>
            //    {
            //        Trace.WriteLine(string.Format("{0}{1}", e, t));
            //        return TaskDone.Done;
            //    },
            //    e => { return TaskDone.Done; });

            var sh = await stream.GetAllSubscriptionHandles();

            Assert.AreEqual <int>(2, sh.Count());


            //await handle.UnsubscribeAsync();
            //var sh1 = await stream.GetAllSubscriptionHandles();

            //Assert.AreEqual<int>(1, sh1.Count());

            //await handle2.UnsubscribeAsync();
            //var sh2 = await stream.GetAllSubscriptionHandles();

            //Assert.AreEqual<int>(0, sh2.Count());


            //var silos = base.GetActiveSilos();
            //foreach (var silo in silos)
            //{
            //    base.RestartSilo(silo);
            //}

            IAsyncStream <int> stream2 = streamProv.GetStream <int>(strmId, "test1");

            for (int i = 10000; i < 25; i++)
            {
                await stream2.OnNextAsync(i);
            }

            StreamSubscriptionHandle <int> handle2More = await stream2.SubscribeAsync(
                (e, t) =>
            {
                Trace.WriteLine(string.Format("{0}{1}", e, t));
                return(TaskDone.Done);
            },
                e => { return(TaskDone.Done); });

            for (int i = 10000; i < 25; i++)
            {
                await stream2.OnNextAsync(i);
            }
        }