Skip to content

Commit

Permalink
Adding background:worker command
Browse files Browse the repository at this point in the history
  • Loading branch information
DeepDiver1975 committed Jul 1, 2016
1 parent 74b29a0 commit d1d3b1e
Show file tree
Hide file tree
Showing 4 changed files with 266 additions and 1 deletion.
61 changes: 61 additions & 0 deletions core/Command/Background/Worker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace OC\Core\Command\Background;

use OC\Console\CommandLogger;
use OCP\ILogger;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class Worker extends Command {

/** @var \OCP\BackgroundJob\IJobList */
private $jobList;
/** @var ILogger */
private $logger;

public function __construct() {
$this->jobList = \OC::$server->getJobList();
parent::__construct();
}

protected function configure() {
$this
->setName("background:worker")
->setDescription("Listen to the background job queue and execute the jobs")
->addOption('sleep', null, InputOption::VALUE_OPTIONAL, 'Number of seconds to sleep when no job is available', 3);
}

/**
* @param InputInterface $input
* @param OutputInterface $output
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$this->logger = new CommandLogger($output);

$waitTime = $input->getOption('sleep');
while (true) {
if (is_null($this->executeNext())) {
sleep($waitTime);
}
}
}

private function executeNext() {
$job = $this->jobList->getNext();
if (is_null($job)) {
return null;
}
$jobId = $job->getId();
$this->logger->debug('Run job with ID ' . $job->getId(), ['app' => 'cron']);
$job->execute($this->jobList, $this->logger);
$this->logger->debug('Finished job with ID ' . $job->getId(), ['app' => 'cron']);

$this->jobList->setLastJob($job);
unset($job);

return $jobId;
}
}
1 change: 1 addition & 0 deletions core/register_command.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
$application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\WebCron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\Ajax(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\Worker());

$application->add(new OC\Core\Command\Config\App\DeleteConfig(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Config\App\GetConfig(\OC::$server->getConfig()));
Expand Down
1 change: 0 additions & 1 deletion db_structure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -974,7 +974,6 @@
<default></default>
<notnull>false</notnull>
</field>

<field>
<!-- timestamp when the job was checked if it needs execution the last time -->
<name>last_checked</name>
Expand Down
204 changes: 204 additions & 0 deletions lib/private/Console/CommandLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
<?php
/**
* @author Thomas Müller <[email protected]>
*
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/

namespace OC\Console;

use OCP\ILogger;
use OCP\Util;
use Symfony\Component\Console\Output\OutputInterface;

class CommandLogger implements ILogger {

/** @var OutputInterface */
private $output;

/**
* CommandLogger constructor.
*
* @param OutputInterface $output
*/
public function __construct(OutputInterface $output) {
$this->output = $output;
}

/**
* System is unusable.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function emergency($message, array $context = array()) {
$this->log(Util::FATAL, $message, $context);
}

/**
* Action must be taken immediately.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function alert($message, array $context = array()) {
$this->log(Util::ERROR, $message, $context);
}

/**
* Critical conditions.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function critical($message, array $context = array()) {
$this->log(Util::ERROR, $message, $context);
}

/**
* Runtime errors that do not require immediate action but should typically
* be logged and monitored.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function error($message, array $context = array()) {
$this->log(Util::ERROR, $message, $context);
}

/**
* Exceptional occurrences that are not errors.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function warning($message, array $context = array()) {
$this->log(Util::WARN, $message, $context);
}

/**
* Normal but significant events.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function notice($message, array $context = array()) {
$this->log(Util::INFO, $message, $context);
}

/**
* Interesting events.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function info($message, array $context = array()) {
$this->log(Util::ERROR, $message, $context);
}

/**
* Detailed debug information.
*
* @param string $message
* @param array $context
* @return null
* @since 7.0.0
*/
public function debug($message, array $context = array()) {
$this->log(Util::DEBUG, $message, $context);
}

/**
* Logs with an arbitrary level.
*
* @param mixed $level
* @param string $message
* @param array $context
* @return mixed
* @since 7.0.0
*/
public function log($level, $message, array $context = array()) {
$minLevel = Util::INFO;
$verbosity = $this->output->getVerbosity();
if ($verbosity === OutputInterface::VERBOSITY_DEBUG) {
$minLevel = Util::DEBUG;
}
if ($verbosity === OutputInterface::VERBOSITY_QUIET) {
$minLevel = Util::ERROR;
}
if ($level < $minLevel) {
return;
}

// interpolate $message as defined in PSR-3
$replace = array();
foreach ($context as $key => $val) {
$replace['{' . $key . '}'] = $val;
}

// interpolate replacement values into the message and return
$message = strtr($message, $replace);
$style = ($level > 2) ?'error' : 'info';

$this->output->writeln("<$style>$message</$style>");
}

/**
* Logs an exception very detailed
* An additional message can we written to the log by adding it to the
* context.
*
* <code>
* $logger->logException($ex, [
* 'message' => 'Exception during cron job execution'
* ]);
* </code>
*
* @param \Exception | \Throwable $exception
* @param array $context
* @return void
* @since 8.2.0
*/
public function logException($exception, array $context = array()) {
$exception = array(
'Exception' => get_class($exception),
'Message' => $exception->getMessage(),
'Code' => $exception->getCode(),
'Trace' => $exception->getTraceAsString(),
'File' => $exception->getFile(),
'Line' => $exception->getLine(),
);
$exception['Trace'] = preg_replace('!(login|checkPassword|updatePrivateKeyPassword)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']);
$msg = isset($context['message']) ? $context['message'] : 'Exception';
$msg .= ': ' . json_encode($exception);
$this->error($msg, $context);
}
}

0 comments on commit d1d3b1e

Please sign in to comment.