private async Task DoBeamJob(BrowserWrapper wrapper, BeamCommand command, CancellationToken deactivateToken) { using var _ = _logger.BeginScope("{JobType} {CommandId} on {BrowserId}", command.GetType().Name, command.Id, wrapper._id); _logger.LogDebug("Start job"); if (wrapper._isInWork || deactivateToken.IsCancellationRequested) { return; } wrapper._isInWork = true; if (wrapper.CanBeStopped) { wrapper._isInWork = false; return; } try { await(command as IBrowserCommand).Execute(wrapper._driver, deactivateToken, _serviceProvider); } catch (Exception ex) { ++wrapper.Fails; _logger.LogError(ex, "Job fail", command.GetType().Name, wrapper._id); } wrapper._isInWork = false; wrapper.LastBeamTime = _dateTimeProvider.UtcNow; if (wrapper.Fails >= _poolSettings.Value.BrowserMaxFail) { wrapper.CanBeStopped = true; } }
Task IBrowserPoolAdvanced.RegisterBrowser(BrowserWrapper browser) { _browsers.Push(browser); return(Task.CompletedTask); }
Task IBrowserPoolAdvanced.DoJob(BrowserWrapper wrapper, BeamCommand command) => DoBeamJob(wrapper, command, _loopCancelTokenSource.Token);
private async Task DoJob(BrowserWrapper wrapper, IBrowserCommand command, CancellationToken deactivateToken) { using var _ = _logger.BeginScope("{JobType} {CommandId} on {BrowserId}", command.GetType().Name, command.Id, wrapper._id); _logger.LogDebug("Start job"); if (!await SaveIfNotValidCommand(command)) { _browsers.Push(wrapper); return; } if (wrapper._isInWork) { _logger.LogError(new InvalidOperationException("Browser wrapper is in inconsistent state. Field name _isInWork."), "Illegal state occurred"); _actions.Enqueue(command); return; } wrapper._isInWork = true; if (wrapper.CanBeStopped) { _logger.LogDebug("Current browser will be stopped. Reenqueue action."); _actions.Enqueue(command); wrapper._isInWork = false; return; } _logger.LogDebug("Validation completed"); var localLoopCancel = new CancellationTokenSource(); var localLoopCancelToken = localLoopCancel.Token; var t = Task.Run(async() => { while (true) { if (localLoopCancelToken.IsCancellationRequested) { break; } else if (command.CancellationToken.IsCancellationRequested) { break; } else if (deactivateToken.IsCancellationRequested) { await _stateProvider.SaveAction(command); break; } Thread.Sleep(200); } }); try { await command.Execute(wrapper._driver, deactivateToken, _serviceProvider); } catch (Exception ex) { ++wrapper.Fails; _logger.LogError(ex, "Job fail", command.GetType().Name, wrapper._id); if (!deactivateToken.IsCancellationRequested) { _actions.Enqueue(command); } } localLoopCancel.Cancel(); wrapper._isInWork = false; wrapper.LastJobTime = _dateTimeProvider.UtcNow; _logger.LogDebug("Finish job", command.GetType().Name, wrapper._id); if (wrapper.Fails < _poolSettings.Value.BrowserMaxFail) { _browsers.Push(wrapper); } else { wrapper.CanBeStopped = true; } }