diff --git a/lib/queue/queuemanager.php b/lib/queue/queuemanager.php index e84d0ba27e..10310fd43b 100644 --- a/lib/queue/queuemanager.php +++ b/lib/queue/queuemanager.php @@ -59,7 +59,6 @@ abstract class QueueManager extends IoManager if (empty(self::$qm)) { if (Event::handle('StartNewQueueManager', array(&self::$qm))) { - $enabled = common_config('queue', 'enabled'); $type = common_config('queue', 'subsystem'); @@ -68,9 +67,6 @@ abstract class QueueManager extends IoManager self::$qm = new UnQueueManager(); } else { switch ($type) { - case 'db': - self::$qm = new DBQueueManager(); - break; default: throw new ServerException("No queue manager class for type '$type'"); } diff --git a/plugins/DBQueue/DBQueuePlugin.php b/plugins/DBQueue/DBQueuePlugin.php new file mode 100644 index 0000000000..59779dba9f --- /dev/null +++ b/plugins/DBQueue/DBQueuePlugin.php @@ -0,0 +1,49 @@ +. + +/** + * DB interface for GNU social queues + * + * @package GNUsocial + * @author Miguel Dantas + * @copyright 2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +defined('GNUSOCIAL') || die(); + +class DBQueuePlugin extends Plugin +{ + const PLUGIN_VERSION = '0.0.1'; + + public function onStartNewQueueManager(?QueueManager &$qm) + { + common_debug("Starting DB queue manager."); + $qm = new DBQueueManager(); + return false; + } + + public function onPluginVersion(array &$versions): bool + { + $versions[] = array('name' => 'DBQueue', + 'version' => self::PLUGIN_VERSION, + 'author' => 'Miguel Dantas', + 'description' => + // TRANS: Plugin description. + _m('Plugin using the database as a backend for GNU social queues')); + return true; + } +}; diff --git a/plugins/DBQueue/README b/plugins/DBQueue/README new file mode 100644 index 0000000000..10913a8907 --- /dev/null +++ b/plugins/DBQueue/README @@ -0,0 +1,18 @@ +DBQueuePlugin wraps the DBQueueManager class which is a queue manager +that uses the database as it's backing storage. + +Installation +============ + +This plugin is replaces other queue manager plugins, such as UnQueue, +which enabled by default and which should, but is not required to be +disabled. + +addPlugin('DBQueue'); + +Example +======= + +In config.php + +addPlugin('DBQueue'); \ No newline at end of file diff --git a/lib/queue/dbqueuemanager.php b/plugins/DBQueue/classes/DBQueueManager.php similarity index 91% rename from lib/queue/dbqueuemanager.php rename to plugins/DBQueue/classes/DBQueueManager.php index 0fc7305c0a..bf8e7fe5d4 100644 --- a/lib/queue/dbqueuemanager.php +++ b/plugins/DBQueue/classes/DBQueueManager.php @@ -50,13 +50,13 @@ class DBQueueManager extends QueueManager } $this->stats('enqueued', $queue); - return true; } /** * Poll every 10 seconds for new events during idle periods. * We'll look in more often when there's data available. + * Must be greater than 0 for the poll method to be called * * @return int seconds */ @@ -69,9 +69,9 @@ class DBQueueManager extends QueueManager * Run a polling cycle during idle processing in the input loop. * @return boolean true if we should poll again for more data immediately */ - public function poll() + public function poll(): bool { - //$this->_log(LOG_DEBUG, 'Checking for notices...'); + $this->_log(LOG_DEBUG, 'Checking for notices...'); $qi = Queue_item::top($this->activeQueues(), $this->getIgnoredTransports()); if (!$qi instanceof Queue_item) { //$this->_log(LOG_DEBUG, 'No notices waiting; idling.'); @@ -88,7 +88,7 @@ class DBQueueManager extends QueueManager $rep = $this->logrep($item); $this->_log(LOG_DEBUG, 'Got '._ve($rep).' for transport '._ve($qi->transport)); - + try { $handler = $this->getHandler($qi->transport); $result = $handler->handle($item); @@ -96,13 +96,16 @@ class DBQueueManager extends QueueManager $this->noHandlerFound($qi, $rep); return true; } catch (NoResultException $e) { - $this->_log(LOG_ERR, "[{$qi->transport}:$rep] ".get_class($e).' thrown ('._ve($e->getMessage()).'), ignoring queue_item '._ve($qi->getID())); + $this->_log(LOG_ERR, "[{$qi->transport}:$rep] ".get_class($e).' thrown ('. + _ve($e->getMessage()).'), ignoring queue_item '._ve($qi->getID())); $result = true; } catch (AlreadyFulfilledException $e) { - $this->_log(LOG_ERR, "[{$qi->transport}:$rep] ".get_class($e).' thrown ('._ve($e->getMessage()).'), ignoring queue_item '._ve($qi->getID())); + $this->_log(LOG_ERR, "[{$qi->transport}:$rep] ".get_class($e).' thrown ('. + _ve($e->getMessage()).'), ignoring queue_item '._ve($qi->getID())); $result = true; } catch (Exception $e) { - $this->_log(LOG_ERR, "[{$qi->transport}:$rep] Exception (".get_class($e).') thrown: '._ve($e->getMessage())); + $this->_log(LOG_ERR, "[{$qi->transport}:$rep] Exception (". + get_class($e).') thrown: '._ve($e->getMessage())); $result = false; } diff --git a/plugins/RedisQueue/classes/RedisQueueManager.php b/plugins/RedisQueue/classes/RedisQueueManager.php index 2eaa7fb408..b4adca7e2f 100644 --- a/plugins/RedisQueue/classes/RedisQueueManager.php +++ b/plugins/RedisQueue/classes/RedisQueueManager.php @@ -10,6 +10,7 @@ class RedisQueueManager extends QueueManager public function __construct(string $server) { + parent::__construct(); $this->server = $server; $this->queue = 'gnusocial:' . common_config('site', 'name'); } @@ -39,7 +40,6 @@ class RedisQueueManager extends QueueManager public function poll() { - common_debug("STARTING POLL"); try { $this->_ensureConn(); $ret = $this->client->lpop($this->queue);