X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fqueuehandler.php;h=ddb47a28e947478a97a3ca988ffa81583459d787;hb=5f9a4ebef493997557ef4470268bed0e5799b6cb;hp=ecf58f69f9cbdb801c068838aeb47492ecc6aefb;hpb=eb2f9c98ac115ce67e9a740b200c832153ffa05c;p=quix0rs-gnu-social.git diff --git a/lib/queuehandler.php b/lib/queuehandler.php index ecf58f69f9..ddb47a28e9 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -1,7 +1,7 @@ . */ -define('CLAIM_TIMEOUT', 1200); - if (!defined('LACONICA')) { exit(1); } require_once(INSTALLDIR.'/lib/daemon.php'); require_once(INSTALLDIR.'/classes/Queue_item.php'); require_once(INSTALLDIR.'/classes/Notice.php'); -class QueueHandler extends Daemon { +define('CLAIM_TIMEOUT', 1200); +define('QUEUE_HANDLER_MISS_IDLE', 10); +define('QUEUE_HANDLER_HIT_IDLE', 10); +class QueueHandler extends Daemon +{ var $_id = 'generic'; - function QueueHandler($id=null) { + function __construct($id=null, $daemonize=true) + { + parent::__construct($daemonize); + if ($id) { $this->set_id($id); } } - - function class_name() { + + function timeout() + { + return null; + } + + function class_name() + { return ucfirst($this->transport()) . 'Handler'; } - function name() { + function name() + { return strtolower($this->class_name().'.'.$this->get_id()); } - - function get_id() { + + function get_id() + { return $this->_id; } - function set_id($id) { + function set_id($id) + { $this->_id = $id; } - - function transport() { + + function transport() + { return null; } - - function start() { + + function start() + { } - - function finish() { + + function finish() + { } - function handle_notice($notice) { + function handle_notice($notice) + { return true; } - - function run() { + + function run() + { if (!$this->start()) { return false; } + $this->log(LOG_INFO, 'checking for queued notices'); - $transport = $this->transport(); - do { - $qi = Queue_item::top($transport); - if ($qi) { - $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created)); - $notice = Notice::staticGet($qi->notice_id); - if ($notice) { - $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id); - # XXX: what to do if broadcast fails? - $result = $this->handle_notice($notice); - if (!$result) { - $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id); - $orig = $qi; - $qi->claimed = null; - $qi->update($orig); - $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id); - continue; - } - $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id); - $notice->free(); - unset($notice); - $notice = null; + + $queue = $this->transport(); + $timeout = $this->timeout(); + + $qm = QueueManager::get(); + + while (true) { + $this->log(LOG_DEBUG, 'Checking for notices...'); + $notice = $qm->nextItem($queue, $timeout); + if (empty($notice)) { + $this->log(LOG_DEBUG, 'No notices waiting; idling.'); + // Nothing in the queue. Do you + // have other tasks, like servicing your + // XMPP connection, to do? + $this->idle(QUEUE_HANDLER_MISS_IDLE); + } else { + $this->log(LOG_INFO, 'Got notice '. $notice->id); + // Yay! Got one! + if ($this->handle_notice($notice)) { + $this->log(LOG_INFO, 'Successfully handled notice '. $notice->id); + $qm->done($notice, $queue); } else { - $this->log(LOG_WARNING, 'queue item for notice that does not exist'); + $this->log(LOG_INFO, 'Failed to handle notice '. $notice->id); + $qm->fail($notice, $queue); } - $qi->delete(); - $qi->free(); - unset($qi); - $this->idle(0); - } else { - $this->clear_old_claims(); - $this->idle(5); - } - } while (true); + // Chance to e.g. service your XMPP connection + $this->log(LOG_DEBUG, 'Idling after success.'); + $this->idle(QUEUE_HANDLER_HIT_IDLE); + } + // XXX: when do we give up? + } + if (!$this->finish()) { return false; } return true; } - function idle($timeout=0) { - if ($timeout>0) { + function idle($timeout=0) + { + if ($timeout > 0) { sleep($timeout); } } - - function clear_old_claims() { - $qi = new Queue_item(); - $qi->transport = $this->transport(); - $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); - $qi->update(DB_DATAOBJECT_WHEREADD_ONLY); - $qi->free(); - unset($qi); - } - - function log($level, $msg) { + + function log($level, $msg) + { common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg); } } - \ No newline at end of file +