Exemplo n.º 1
0
        public async Task <BlockOutput> Pop(NodeHeartbeatInput heartbeat)
        {
            using (var conn = CreateDbConnection())
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                var         transaction = conn.BeginTransaction();
                BlockOutput output      = new BlockOutput {
                    Command = Command.Download
                };
                try
                {
                    var running = await _runningService.Pop(conn, transaction, heartbeat.Runnings);

                    output.Identity = running.Identity;

                    var block = await conn.QueryFirstOrDefaultAsync <Block>($@"SELECT TOP 1 * FROM block WHERE
{LeftEscapeSql}identity{RightEscapeSql}=@Identity WHERE status = 1 or status = 5", new { running.Identity }, transaction);

                    if (block != null)
                    {
                        await conn.ExecuteAsync($"UPDATE block SET status =@Status, lastmodificationtime={GetDateSql} WHERE blockid=@BlockId",
                                                new { Status = BlockStatus.Using, block.BlockId }, transaction);

                        var requests = await _requestQueueService.GetByBlockId(block.BlockId);

                        output.Requests = requests.Select(r =>
                        {
                            var request = JsonConvert.DeserializeObject <Request>(r.Request);
                            return(new RequestOutput {
                                Content = request.Content, CycleTriedTimes = request.CycleTriedTimes, Depth = request.Depth, Method = request.Method, Origin = request.Origin, Referer = request.Referer, Url = request.Url
                            });
                        }).ToList();
                        output.BlockId   = block.BlockId;
                        output.Site      = JsonConvert.DeserializeObject <Site>(running.Site);
                        output.ThreadNum = running.ThreadNum;
                    }
                    transaction.Commit();
                }
                catch
                {
                    try
                    {
                        transaction.Rollback();
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex.ToString());
                    }
                    throw;
                }
                return(output);
            }
        }
        public async Task <IActionResult> Dequeue(string identity)
        {
            Block block = await _blockService.GetOneCompletedByIdentity(identity);

            var requestQueues = await _requestQueueService.GetByBlockId(block.BlockId);

            var requests = requestQueues.Select(r =>
            {
                return(JsonConvert.DeserializeObject <Request>(r.Request));
            }).ToList();

            return(new JsonResult(requests));
        }