3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
29 * The queue service provides an interface for creating or locating
30 * queues. Note that this approach hides the details of data-storage:
31 * different queue-providers may store the queue content in different
32 * ways (in memory, in SQL, or in an external service).
35 * $queue = CRM_Queue_Service::singleton()->create(array(
36 * 'type' => 'interactive',
37 * 'name' => 'upgrade-tasks',
39 * $queue->createItem($myData);
41 * // Some time later...
42 * $item = $queue->claimItem();
44 * if (my_process($item->data)) {
45 * $queue->deleteItem($item);
47 * $queue->releaseItem($item);
52 class CRM_Queue_Service
{
54 protected static $_singleton;
57 * FIXME: Singleton pattern should be removed when dependency-injection
60 * @param bool $forceNew
61 * TRUE if a new instance must be created.
63 * @return \CRM_Queue_Service
65 public static function &singleton($forceNew = FALSE) {
66 if ($forceNew ||
!self
::$_singleton) {
67 self
::$_singleton = new CRM_Queue_Service();
69 return self
::$_singleton;
73 * @var array (string $queueName => CRM_Queue_Queue)
79 public function __construct() {
84 * Create a queue. If one already exists, then it will be reused.
86 * @param array $queueSpec
88 * - type: string, required, e.g. "interactive", "immediate", "stomp",
90 * - name: string, required, e.g. "upgrade-tasks"
91 * - reset: bool, optional; if a queue is found, then it should be
92 * flushed; default to TRUE
93 * - (additional keys depending on the queue provider).
95 * @return CRM_Queue_Queue
97 public function create($queueSpec) {
98 if (@is_object
($this->queues
[$queueSpec['name']]) && empty($queueSpec['reset'])) {
99 return $this->queues
[$queueSpec['name']];
102 $queue = $this->instantiateQueueObject($queueSpec);
103 $exists = $queue->existsQueue();
105 $queue->createQueue();
107 elseif (@$queueSpec['reset']) {
108 $queue->deleteQueue();
109 $queue->createQueue();
114 $this->queues
[$queueSpec['name']] = $queue;
119 * Look up an existing queue.
121 * @param array $queueSpec
123 * - type: string, required, e.g. "interactive", "immediate", "stomp",
125 * - name: string, required, e.g. "upgrade-tasks"
126 * - (additional keys depending on the queue provider).
128 * @return CRM_Queue_Queue
130 public function load($queueSpec) {
131 if (is_object($this->queues
[$queueSpec['name']])) {
132 return $this->queues
[$queueSpec['name']];
134 $queue = $this->instantiateQueueObject($queueSpec);
136 $this->queues
[$queueSpec['name']] = $queue;
141 * Convert a queue "type" name to a class name.
143 * @param string $type
144 * E.g. "interactive", "immediate", "stomp", "beanstalk".
149 protected function getQueueClass($type) {
150 $type = preg_replace('/[^a-zA-Z0-9]/', '', $type);
151 $className = 'CRM_Queue_Queue_' . $type;
152 // FIXME: when used with class-autoloader, this may be unnecessary
153 if (!class_exists($className)) {
154 $classFile = 'CRM/Queue/Queue/' . $type . '.php';
155 require_once $classFile;
161 * @param array $queueSpec
164 * @return CRM_Queue_Queue
166 protected function instantiateQueueObject($queueSpec) {
167 // note: you should probably never do anything else here
168 $class = new ReflectionClass($this->getQueueClass($queueSpec['type']));
169 return $class->newInstance($queueSpec);