コード例 #1
0
        /// <summary>
        /// Execute a command
        /// </summary>
        /// <param name="command">unique ID of command</param>
        public void Execute(BrowserCommand command)
        {
            // verify that the command exists
            Debug.Assert(m_commands.Contains(command),
                         "Attempted to Execute a command that doesn't exist");

            // execute
            IBrowserCommand cmdExecute = (IBrowserCommand)m_commands[command];

            if (cmdExecute != null)
            {
                cmdExecute.Execute();
            }
        }
コード例 #2
0
        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;
            }
        }