]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Exception handling in queue handler logic
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 14 Jan 2016 01:04:15 +0000 (02:04 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 14 Jan 2016 01:04:15 +0000 (02:04 +0100)
lib/dbqueuemanager.php
lib/noqueuehandlerexception.php [new file with mode: 0644]
lib/stompqueuemanager.php
lib/unqueuemanager.php
scripts/handlequeued.php

index 3adac08971f8095d21424a605b29099e1da08158..5497a1089a30dccdb60e643550a0daee904c2f94 100644 (file)
@@ -89,23 +89,24 @@ class DBQueueManager extends QueueManager
         $rep = $this->logrep($item);
         $this->_log(LOG_DEBUG, "Got {$rep} for transport {$qi->transport}");
         
-        $handler = $this->getHandler($qi->transport);
-        if ($handler) {
-            try {
-                $result = $handler->handle($item)
-            } catch (Exception $e) {
-                $result = false;
-                $this->_log(LOG_ERR, "[{$qi->transport}:$rep] Exception thrown: {$e->getMessage()}");
-            }
-            if ($result) {
-                $this->_log(LOG_INFO, "[{$qi->transport}:$rep] Successfully handled item");
-                $this->_done($qi);
-            } else {
-                $this->_log(LOG_INFO, "[{$qi->transport}:$rep] Failed to handle item");
-                $this->_fail($qi);
-            }
-        } else {
+        try {
+            $handler = $this->getHandler($qi->transport);
+            $result = $handler->handle($item)
+        } catch (NoQueueHandlerException $e) {
             $this->noHandlerFound($qi, $rep);
+            return true;
+        } catch (Exception $e) {
+            $this->_log(LOG_ERR, "[{$qi->transport}:$rep] Exception thrown: {$e->getMessage()}");
+            $this->_fail($qi);
+            return true;
+        }
+
+        if ($result) {
+            $this->_log(LOG_INFO, "[{$qi->transport}:$rep] Successfully handled item");
+            $this->_done($qi);
+        } else {
+            $this->_log(LOG_INFO, "[{$qi->transport}:$rep] Failed to handle item");
+            $this->_fail($qi);
         }
         return true;
     }
diff --git a/lib/noqueuehandlerexception.php b/lib/noqueuehandlerexception.php
new file mode 100644 (file)
index 0000000..fabe154
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Class for an exception when there is no queuehandler for this transport type
+ *
+ * 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  Exception
+ * @package   GNUsocial
+ * @author    Mikael Nordfeldth <mmn@hethane.se>
+ * @copyright 2016 Free Software Foundation, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://www.gnu.org/software/social/
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+class NoQueueHandlerException extends ServerException
+{
+    public $transport;    // The object with query that gave no results
+
+    public function __construct($transport)
+    {
+        $this->transport = $transport;
+        parent::__construct(sprintf(_('No queue handler found for transport %s.'), _ve($this->transport)));
+    }
+}
index 4084470e211f9cc0c656c18512f637bf6cd48e19..7c3af4945e2b1db7eb039a47bf1b007961a789a3 100644 (file)
@@ -509,15 +509,13 @@ class StompQueueManager extends QueueManager
                 $frame->headers['created'] . " in queue $queue from $host";
         $this->_log(LOG_DEBUG, "Dequeued $info");
 
-        $handler = $this->getHandler($queue);
-        if (!$handler) {
+        try {
+            $handler = $this->getHandler($queue);
+            $ok = $handler->handle($item);
+        } catch (NoQueueHandlerException $e) {
             $this->_log(LOG_ERR, "Missing handler class; skipping $info");
             $this->stats('badhandler', $queue);
             return false;
-        }
-
-        try {
-            $ok = $handler->handle($item);
         } catch (Exception $e) {
             $this->_log(LOG_ERR, "Exception on queue $queue: " . $e->getMessage());
             $ok = false;
index 785de7c8ce25b629a7665fbb1ab3df22e19ab997..0540b767d218300c03c58bbfb603bd7b7dfc36f1 100644 (file)
@@ -38,19 +38,17 @@ class UnQueueManager extends QueueManager
      * that can be processed quickly and don't need polling or long-running
      * connections to another server such as XMPP.
      *
-     * @param Notice $object
+     * @param Notice $object    this specific manager just handles Notice objects anyway
      * @param string $queue
      */
-    function enqueue($object, $queue)
+    function enqueue($object, $transport)
     {
-        $notice = $object;
-        
-        $handler = $this->getHandler($queue);
-        if ($handler) {
-            $handler->handle($notice);
-        } else {
-            if (Event::handle('UnqueueHandleNotice', array(&$notice, $queue))) {
-                throw new ServerException("UnQueueManager: Unknown queue: $queue");
+        try {
+            $handler = $this->getHandler($transport);
+            $handler->handle($object);
+        } catch (NoQueueHandlerException $e) {
+            if (Event::handle('UnqueueHandleNotice', array(&$object, $transport))) {
+                throw new ServerException("UnQueueManager: Unknown queue transport: $transport");
             }
         }
     }
index eb7d8297136cdb3dd461752d0ca8bc65439120c1..0d77030c3f40b8542b330727538cc411532051da 100755 (executable)
@@ -38,19 +38,21 @@ $queue = trim($args[0]);
 $noticeId = intval($args[1]);
 
 $qm = QueueManager::get();
-$handler = $qm->getHandler($queue);
-if (!$handler) {
+try {
+    $handler = $qm->getHandler($queue);
+    $notice = Notice::getByID($noticeId);
+    $result = $handler->handle($notice);
+} catch (NoQueueHandlerException $e) {
     print "No handler for queue '$queue'.\n";
     exit(1);
-}
-
-$notice = Notice::getKV('id', $noticeId);
-if (empty($notice)) {
-    print "Invalid notice id $noticeId\n";
+} catch (NoResultException $e) {
+    print "{$e->getMessage()}\n";
+    exit(1);
+} catch (Exception $e) {
+    print "Exception thrown while handling: {$e->getMessage()}\n";
     exit(1);
 }
-
-if (!$handler->handle($notice)) {
+if (!$result) {
     print "Failed to handle notice id $noticeId on queue '$queue'.\n";
     exit(1);
 }