| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |  * Abstract class for i/o managers | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  QueueManager | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @author    Sarven Capadisli <csarven@status.net> | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |  * @author    Brion Vibber <brion@status.net> | 
					
						
							|  |  |  |  * @copyright 2009-2010 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link      http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Completed child classes must implement the enqueue() method. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * For background processing, classes should implement either socket-based | 
					
						
							|  |  |  |  * input (handleInput(), getSockets()) or idle-loop polling (idle()). | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | abstract class QueueManager extends IoManager | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     static $qm = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     protected $master = null; | 
					
						
							|  |  |  |     protected $handlers = array(); | 
					
						
							|  |  |  |     protected $groups = array(); | 
					
						
							|  |  |  |     protected $activeGroups = array(); | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Factory function to pull the appropriate QueueManager object | 
					
						
							|  |  |  |      * for this site's configuration. It can then be used to queue | 
					
						
							|  |  |  |      * events for later processing or to spawn a processing loop. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Plugins can add to the built-in types by hooking StartNewQueueManager. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return QueueManager | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function get() | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (empty(self::$qm)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 11:34:12 -04:00
										 |  |  |             if (Event::handle('StartNewQueueManager', array(&self::$qm))) { | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 11:34:12 -04:00
										 |  |  |                 $enabled = common_config('queue', 'enabled'); | 
					
						
							| 
									
										
										
										
											2009-07-01 12:09:18 -04:00
										 |  |  |                 $type = common_config('queue', 'subsystem'); | 
					
						
							| 
									
										
										
										
											2009-07-01 11:34:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if (!$enabled) { | 
					
						
							|  |  |  |                     // does everything immediately
 | 
					
						
							| 
									
										
										
										
											2009-07-01 12:09:18 -04:00
										 |  |  |                     self::$qm = new UnQueueManager(); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     switch ($type) { | 
					
						
							|  |  |  |                      case 'db': | 
					
						
							|  |  |  |                         self::$qm = new DBQueueManager(); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                      case 'stomp': | 
					
						
							|  |  |  |                         self::$qm = new StompQueueManager(); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                      default: | 
					
						
							|  |  |  |                         throw new ServerException("No queue manager class for type '$type'"); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-07-04 01:42:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return self::$qm; | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @fixme wouldn't necessarily work with other class types. | 
					
						
							|  |  |  |      * Better to change the interface...? | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function multiSite() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (common_config('queue', 'subsystem') == 'stomp') { | 
					
						
							|  |  |  |             return IoManager::INSTANCE_PER_PROCESS; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return IoManager::SINGLE_ONLY; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function __construct() | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         $this->initialize(); | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 11:49:49 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Optional; ping any running queue handler daemons with a notification | 
					
						
							|  |  |  |      * such as announcing a new site to handle or requesting clean shutdown. | 
					
						
							|  |  |  |      * This avoids having to restart all the daemons manually to update configs | 
					
						
							|  |  |  |      * and such. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Called from scripts/queuectl.php controller utility. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $event event key | 
					
						
							|  |  |  |      * @param string $param optional parameter to append to key | 
					
						
							|  |  |  |      * @return boolean success | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function sendControlSignal($event, $param='') | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         throw new Exception(get_class($this) . " does not support control signals."); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Store an object (usually/always a Notice) into the given queue | 
					
						
							|  |  |  |      * for later processing. No guarantee is made on when it will be | 
					
						
							|  |  |  |      * processed; it could be immediately or at some unspecified point | 
					
						
							|  |  |  |      * in the future. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Must be implemented by any queue manager. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $object | 
					
						
							|  |  |  |      * @param string $queue | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     abstract function enqueue($object, $queue); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Build a representation for an object for logging | 
					
						
							|  |  |  |      * @param mixed | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function logrep($object) { | 
					
						
							|  |  |  |         if (is_object($object)) { | 
					
						
							|  |  |  |             $class = get_class($object); | 
					
						
							|  |  |  |             if (isset($object->id)) { | 
					
						
							|  |  |  |                 return "$class $object->id"; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $class; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (is_string($object)) { | 
					
						
							|  |  |  |             $len = strlen($object); | 
					
						
							|  |  |  |             $fragment = mb_substr($object, 0, 32); | 
					
						
							|  |  |  |             if (mb_strlen($object) > 32) { | 
					
						
							|  |  |  |                 $fragment .= '...'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return "string '$fragment' ($len bytes)"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return strval($object); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |      * Encode an object or variable for queued storage. | 
					
						
							|  |  |  |      * Notice objects are currently stored as an id reference; | 
					
						
							|  |  |  |      * other items are serialized. | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |      * @param mixed $item | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |     protected function encode($item) | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |         if ($item instanceof Notice) { | 
					
						
							|  |  |  |             // Backwards compat
 | 
					
						
							|  |  |  |             return $item->id; | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |             return serialize($item); | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Decode an object from queued storage. | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |      * Accepts notice reference entries and serialized items. | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param string | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function decode($frame) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (is_numeric($frame)) { | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |             // Back-compat for notices...
 | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |             return Notice::staticGet(intval($frame)); | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |         } elseif (substr($frame, 0, 1) == '<') { | 
					
						
							|  |  |  |             // Back-compat for XML source
 | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |             return $frame; | 
					
						
							| 
									
										
										
										
											2010-02-08 16:43:37 -08:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             // Deserialize!
 | 
					
						
							|  |  |  |             #$old = error_reporting();
 | 
					
						
							|  |  |  |             #error_reporting($old & ~E_NOTICE);
 | 
					
						
							|  |  |  |             $out = unserialize($frame); | 
					
						
							|  |  |  |             #error_reporting($old);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($out === false && $frame !== 'b:0;') { | 
					
						
							|  |  |  |                 common_log(LOG_ERR, "Couldn't unserialize queued frame: $frame"); | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $out; | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Instantiate the appropriate QueueHandler class for the given queue. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $queue | 
					
						
							|  |  |  |      * @return mixed QueueHandler or null | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getHandler($queue) | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         if (isset($this->handlers[$queue])) { | 
					
						
							|  |  |  |             $class = $this->handlers[$queue]; | 
					
						
							| 
									
										
										
										
											2010-01-23 01:03:41 -05:00
										 |  |  |             if(is_object($class)) { | 
					
						
							|  |  |  |                 return $class; | 
					
						
							|  |  |  |             } else if (class_exists($class)) { | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |                 return new $class(); | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 $this->_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'"); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             $this->_log(LOG_ERR, "Requested handler for unkown queue '$queue'"); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      * Get a list of registered queue transport names to be used | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |      * for listening in this daemon. | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return array of strings | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     function activeQueues() | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         $queues = array(); | 
					
						
							|  |  |  |         foreach ($this->activeGroups as $group) { | 
					
						
							|  |  |  |             if (isset($this->groups[$group])) { | 
					
						
							|  |  |  |                 $queues = array_merge($queues, $this->groups[$group]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return array_keys($queues); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |      * Initialize the list of queue handlers for the current site. | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @event StartInitializeQueueManager | 
					
						
							|  |  |  |      * @event EndInitializeQueueManager | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         $this->handlers = array(); | 
					
						
							|  |  |  |         $this->groups = array(); | 
					
						
							|  |  |  |         $this->groupsByTransport = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         if (Event::handle('StartInitializeQueueManager', array($this))) { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             $this->connect('distrib', 'DistribQueueHandler'); | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |             $this->connect('omb', 'OmbQueueHandler'); | 
					
						
							|  |  |  |             $this->connect('ping', 'PingQueueHandler'); | 
					
						
							|  |  |  |             if (common_config('sms', 'enabled')) { | 
					
						
							|  |  |  |                 $this->connect('sms', 'SmsQueueHandler'); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-15 15:08:16 -07:00
										 |  |  |             // Background user management tasks...
 | 
					
						
							|  |  |  |             $this->connect('deluser', 'DelUserQueueHandler'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-24 20:36:36 +00:00
										 |  |  |             // Broadcasting profile updates to OMB remote subscribers
 | 
					
						
							|  |  |  |             $this->connect('profile', 'ProfileQueueHandler'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |             // XMPP output handlers...
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             if (common_config('xmpp', 'enabled')) { | 
					
						
							|  |  |  |                 // Delivery prep, read by queuedaemon.php:
 | 
					
						
							|  |  |  |                 $this->connect('jabber', 'JabberQueueHandler'); | 
					
						
							|  |  |  |                 $this->connect('public', 'PublicQueueHandler'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Raw output, read by xmppdaemon.php:
 | 
					
						
							|  |  |  |                 $this->connect('xmppout', 'XmppOutQueueHandler', 'xmpp'); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // For compat with old plugins not registering their own handlers.
 | 
					
						
							|  |  |  |             $this->connect('plugin', 'PluginQueueHandler'); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         Event::handle('EndInitializeQueueManager', array($this)); | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Register a queue transport name and handler class for your plugin. | 
					
						
							|  |  |  |      * Only registered transports will be reliably picked up! | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $transport | 
					
						
							| 
									
										
										
										
											2010-01-23 01:03:41 -05:00
										 |  |  |      * @param string $class class name or object instance | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      * @param string $group | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     public function connect($transport, $class, $group='main') | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->handlers[$transport] = $class; | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         $this->groups[$group][$transport] = $class; | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         $this->groupsByTransport[$transport] = $group; | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |      * Set the active group which will be used for listening. | 
					
						
							|  |  |  |      * @param string $group | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     function setActiveGroup($group) | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         $this->activeGroups = array($group); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Set the active group(s) which will be used for listening. | 
					
						
							|  |  |  |      * @param array $groups | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function setActiveGroups($groups) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->activeGroups = $groups; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @return string queue group for this queue | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function queueGroup($queue) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (isset($this->groupsByTransport[$queue])) { | 
					
						
							|  |  |  |             return $this->groupsByTransport[$queue]; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             throw new Exception("Requested group for unregistered transport $queue"); | 
					
						
							| 
									
										
										
										
											2010-01-21 16:42:50 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Send a statistic ping to the queue monitoring system, | 
					
						
							|  |  |  |      * optionally with a per-queue id. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $key | 
					
						
							|  |  |  |      * @param string $queue | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function stats($key, $queue=false) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $owners = array(); | 
					
						
							|  |  |  |         if ($queue) { | 
					
						
							|  |  |  |             $owners[] = "queue:$queue"; | 
					
						
							|  |  |  |             $owners[] = "site:" . common_config('site', 'server'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (isset($this->master)) { | 
					
						
							|  |  |  |             $this->master->stats($key, $owners); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $monitor = new QueueMonitor(); | 
					
						
							|  |  |  |             $monitor->stats($key, $owners); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-07-01 12:09:18 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected function _log($level, $msg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $class = get_class($this); | 
					
						
							|  |  |  |         if ($this->activeGroups) { | 
					
						
							|  |  |  |             $groups = ' (' . implode(',', $this->activeGroups) . ')'; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $groups = ''; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         common_log($level, "$class$groups: $msg"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-28 14:38:31 -04:00
										 |  |  | } |