Exemple #1
0
 public void ResponseArrived(CrawlerSqlResponse sqlResponse)
 {
     if (WaitingRequests.ContainsKey(sqlResponse.Guid))
     {
         var resetEvent = WaitingRequests[sqlResponse.Guid];
         WaitingRequests.Remove(sqlResponse.Guid);
         ResponsesCompleted.Add(sqlResponse.Guid, sqlResponse);
         resetEvent.Set();
     }
 }
Exemple #2
0
        public Task <CrawlerSqlResponse> DoSqlRequest(string statement, string groupName)
        {
            var guid = Nanoid.Nanoid.Generate();

            if (!IsTerminalAvailable(groupName))
            {
                return(Task.FromResult(new CrawlerSqlResponse(guid)
                {
                    HasFailed = true, Exception = new CrawlerNotFound("No crawlers available")
                }));
            }

            return(Task.Run(() =>
            {
                var request = new CrawlerSqlRequest(guid, statement);
                var resetEvent = new ManualResetEvent(false);
                WaitingRequests.Add(guid, resetEvent);

                HubContext.Clients.Group(groupName).SendCoreAsync("sql", new object[] { request });

                resetEvent.WaitOne(TimeSpan.FromMinutes(10));
                resetEvent.Dispose();

                if (ResponsesCompleted.ContainsKey(guid))
                {
                    var crawlerSqlResponse = ResponsesCompleted[guid];
                    ResponsesCompleted.Remove(guid);
                    return crawlerSqlResponse;
                }

                return new CrawlerSqlResponse(guid)
                {
                    HasFailed = true, Exception = new TimeoutException("The crawler didn't respond in time")
                };
            }));
        }