if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
-require_once(INSTALLDIR.'/lib/daemon.php');
-require_once(INSTALLDIR.'/classes/Queue_item.php');
-require_once(INSTALLDIR.'/classes/Notice.php');
-
-define('CLAIM_TIMEOUT', 1200);
-define('QUEUE_HANDLER_MISS_IDLE', 10);
-define('QUEUE_HANDLER_HIT_IDLE', 0);
-
/**
* Base class for queue handlers.
*
- * As extensions of the Daemon class, each queue handler has the ability
- * to launch itself in the background, at which point it'll pass control
- * to the configured QueueManager class to poll for updates.
+ * As of 0.9, queue handlers are short-lived for items as they are
+ * dequeued by a QueueManager running in an IoMaster in a daemon
+ * such as queuedaemon.php.
+ *
+ * Extensions requiring long-running maintenance or polling should
+ * register an IoManager.
*
* Subclasses must override at least the following methods:
* - transport
- * - start
- * - finish
- * - handle_notice
- *
- * Some subclasses will also want to override the idle handler:
- * - idle
+ * - handle
*/
-class QueueHandler extends Daemon
+class QueueHandler
{
- function __construct($id=null, $daemonize=true)
- {
- parent::__construct($daemonize);
-
- if ($id) {
- $this->set_id($id);
- }
- }
-
- /**
- * How many seconds a polling-based queue manager should wait between
- * checks for new items to handle.
- *
- * Defaults to 60 seconds; override to speed up or slow down.
- *
- * @return int timeout in seconds
- */
- function timeout()
- {
- return 60;
- }
-
- function class_name()
- {
- return ucfirst($this->transport()) . 'Handler';
- }
-
- function name()
- {
- return strtolower($this->class_name().'.'.$this->get_id());
- }
-
- /**
- * Return transport keyword which identifies items this queue handler
- * services; must be defined for all subclasses.
- *
- * Must be 8 characters or less to fit in the queue_item database.
- * ex "email", "jabber", "sms", "irc", ...
- *
- * @return string
- */
- function transport()
- {
- return null;
- }
-
- /**
- * Initialization, run when the queue handler starts.
- * If this function indicates failure, the handler run will be aborted.
- *
- * @fixme run() will abort if this doesn't return true,
- * but some subclasses don't bother.
- * @return boolean true on success, false on failure
- */
- function start()
- {
- }
-
- /**
- * Cleanup, run when the queue handler ends.
- * If this function indicates failure, a warning will be logged.
- *
- * @fixme run() will throw warnings if this doesn't return true,
- * but many subclasses don't bother.
- * @return boolean true on success, false on failure
- */
- function finish()
- {
- }
-
/**
* Here's the meat of your queue handler -- you're handed a Notice
- * object, which you may do as you will with.
+ * or other object, which you may do as you will with.
*
* If this function indicates failure, a warning will be logged
* and the item is placed back in the queue to be re-run.
*
- * @param Notice $notice
- * @return boolean true on success, false on failure
- */
- function handle_notice($notice)
- {
- return true;
- }
-
- /**
- * Setup and start of run loop for this queue handler as a daemon.
- * Most of the heavy lifting is passed on to the QueueManager's service()
- * method, which passes control back to our handle_notice() method for
- * each notice that comes in on the queue.
- *
- * Most of the time this won't need to be overridden in a subclass.
- *
+ * @param mixed $object
* @return boolean true on success, false on failure
*/
- function run()
+ function handle($object)
{
- if (!$this->start()) {
- $this->log(LOG_WARNING, 'failed to start');
- return false;
- }
-
- $this->log(LOG_INFO, 'checking for queued notices');
-
- $queue = $this->transport();
- $timeout = $this->timeout();
-
- $qm = QueueManager::get();
-
- $qm->service($queue, $this);
-
- $this->log(LOG_INFO, 'finished servicing the queue');
-
- if (!$this->finish()) {
- $this->log(LOG_WARNING, 'failed to clean up');
- return false;
- }
-
- $this->log(LOG_INFO, 'terminating normally');
-
return true;
}
-
- /**
- * Called by QueueHandler after each handled item or empty polling cycle.
- * This is a good time to e.g. service your XMPP connection.
- *
- * Doesn't need to be overridden if there's no maintenance to do.
- *
- * @param int $timeout seconds to sleep if there's nothing to do
- */
- function idle($timeout=0)
- {
- if ($timeout > 0) {
- sleep($timeout);
- }
- }
-
- function log($level, $msg)
- {
- common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
- }
-
- function getSockets()
- {
- return array();
- }
}