Exemplo n.º 1
0
        override public async Task ReadFeeds(ClientInfo request, IServerStreamWriter <FeedInfo> responseStream,
                                             ServerCallContext context)
        {
            try
            {
                var client = await _locker.LockAsync(async() =>
                                                     await _rssManager.GetClient(request.ClientId));

                if (client != null)
                {
                    //reset when client connected, save just for online time
                    //0 because client does not store feeds now
                    //force refresh
                    UpdateLastLoadedSafe(request.ClientId, 0);

                    //continuous wait for some new aggregation
                    while (true)
                    {
                        //sorted by date descending
                        var rsses = await _locker.LockAsync(async() =>
                                                            await _rssManager.RssForClient(client.ClientId,
                                                                                           lastLoadedRss.Keys.Contains(client.ClientId) ? lastLoadedRss[client.ClientId] : 0,
                                                                                           DateTime.Now.AddDays(-2))
                                                            );

                        if (rsses.Count > 0)
                        {
                            LogInformationSafe("Transferring " + rsses.Count + " feeds to client " + client.ClientId);

                            UpdateLastLoadedSafe(request.ClientId, rsses.Max(r => r.RssId));

                            foreach (var rss in rsses)
                            {
                                var fi = new FeedInfo()
                                {
                                    FeedXml = rss.FeedXml
                                };
                                foreach (var tag in rss.RssToTags)
                                {
                                    fi.Tags.Add(tag.Tag.TagName);
                                }
                                Thread.Sleep(50);

                                await responseStream.WriteAsync(fi);
                            }

                            LogInformationSafe("All feeds have been transferred to " + client.ClientId);
                        }
                        //sleep 20 sec
                        Thread.Sleep(1000 * 20);
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogWarning("Client RSS sender: " + ex.ToString());
            }
            context.Status = Status.DefaultCancelled;
        }