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)); }