}
/**
- * Here's the meat of your queue handler -- you're handed a Notice
- * object, which you may do as you will with.
+ * Handle distribution of a notice after we've saved it:
+ * @li add to local recipient inboxes
+ * @li send email notifications to local @-reply targets
+ * @li run final EndNoticeSave plugin events
+ * @li put any remaining post-processing into the queues
*
* If this function indicates failure, a warning will be logged
* and the item is placed back in the queue to be re-run.
*
+ * @fixme addToInboxes is known to fail sometimes with large recipient sets
+ *
* @param Notice $notice
* @return boolean true on success, false on failure
*/
function handle($notice)
{
- // XXX: do we need to change this for remote users?
-
- $notice->saveTags();
-
- $groups = $notice->saveGroups();
-
- $recipients = $notice->saveReplies();
+ try {
+ $notice->addToInboxes();
+ } catch (Exception $e) {
+ $this->logit($notice, $e);
+ }
- $notice->addToInboxes($groups, $recipients);
+ try {
+ $notice->sendReplyNotifications();
+ } catch (Exception $e) {
+ $this->logit($notice, $e);
+ }
- $notice->saveUrls();
+ try {
+ Event::handle('EndNoticeSave', array($notice));
+ // Enqueue for other handlers
+ } catch (Exception $e) {
+ $this->logit($notice, $e);
+ }
- Event::handle('EndNoticeSave', array($notice));
+ try {
+ common_enqueue_notice($notice);
+ } catch (Exception $e) {
+ $this->logit($notice, $e);
+ }
- // Enqueue for other handlers
+ return true;
+ }
- common_enqueue_notice($notice);
+ protected function logit($notice, $e)
+ {
+ common_log(LOG_ERR, "Distrib queue exception saving notice $notice->id: " .
+ $e->getMessage() . ' ' .
+ str_replace("\n", " ", $e->getTraceAsString()));
- return true;
+ // We'll still return true so we don't get stuck in a loop
+ // trying to run a bad insert over and over...
}
}