From 0f141b4f9c7d188c2dd77db694d781ee8e972225 Mon Sep 17 00:00:00 2001 From: khoa Date: Mon, 15 Feb 2016 03:01:01 +0000 Subject: [PATCH 1/4] Support queue.failer service to record failed jobs in mongo --- README.md | 25 ++++ .../Mongodb/MongodbServiceProvider.php | 7 + .../Failed/DatabaseFailedJobProvider.php | 120 ++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php diff --git a/README.md b/README.md index 032d5ce3d..0749eeb35 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,31 @@ If you want to use Laravel's native Auth functionality, register this included s This service provider will slightly modify the internal DatabaseReminderRepository to add support for MongoDB based password reminders. If you don't use password reminders, you don't have to register this service provider and everything else should work just fine. + +### Queues + +If you want to use MongoDB as your database backend, change the the driver in `config/queue.php`: + +```php +'connections' => [ + 'database' => [ + 'driver' => 'mongodb', + 'table' => 'jobs', + 'queue' => 'default', + 'expire' => 60, + ], +] +``` + +To log failed queue jobs to MongoDB, override `failed` in `config/queue.php` (appears at the end of `queue.php`): + +```php +'failed' => [ + 'database' => 'mongodb', + 'collection' => 'failed_jobs', +] +``` + ### Sentry If you want to use this library with [Sentry](https://cartalyst.com/manual/sentry), then check out https://github.com/jenssegers/Laravel-MongoDB-Sentry diff --git a/src/Jenssegers/Mongodb/MongodbServiceProvider.php b/src/Jenssegers/Mongodb/MongodbServiceProvider.php index 426440e5f..86c683316 100644 --- a/src/Jenssegers/Mongodb/MongodbServiceProvider.php +++ b/src/Jenssegers/Mongodb/MongodbServiceProvider.php @@ -33,5 +33,12 @@ public function register() return new MongoConnector($this->app['db']); }); }); + + // Support queue failer to record failed jobs + $this->app->bindShared('queue.failer', function($app) + { + $config = $app['config']['queue.failed']; + return new DatabaseFailedJobProvider($app['db'], $config['database'], $config['collection']); + }); } } diff --git a/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php b/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php new file mode 100644 index 000000000..b660bd43c --- /dev/null +++ b/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php @@ -0,0 +1,120 @@ +collection = $collection; + $this->resolver = $resolver; + $this->database = $database; + } + + /** + * Log a failed job into storage. + * + * @param string $connection + * @param string $queue + * @param string $payload + * @return void + */ + public function log($connection, $queue, $payload) { + $failed_at = Carbon::now(); + $this->getCollection()->insert(compact('connection', 'queue', 'payload', 'failed_at')); + } + + /** + * Get a list of all of the failed jobs. + * + * @return array + */ + public function all() { + $fails = $this->getCollection()->get(); + $jobs = []; + foreach ($fails as $fail) { + $fail = ['id' => (string) $fail['_id']] + $fail; + unset($fail['_id']); + $failed = new Carbon($fail['failed_at']['date'], $fail['failed_at']['timezone']); + $fail['failed_at'] = (string) $failed; + $jobs[] = $fail; + } + return $jobs; + } + + /** + * Get a single failed job. + * + * @param mixed $id + * @return array + */ + public function find($id) { + $fail = $this->getCollection()->find($id); + if ($fail) { + $fail = ['id' => (string) $fail['_id']] + $fail; + unset($fail['_id']); + return (object) $fail; + } + return NULL; + } + + /** + * Delete a single failed job from storage. + * + * @param mixed $id + * @return bool + */ + public function forget($id) { + return $this->getCollection()->delete($id) > 0; + } + + /** + * Flush all of the failed jobs from storage. + * + * @return void + */ + public function flush() { + $this->getCollection()->truncate(); + } + + /** + * Get a new query builder instance for the table. + * + * @return \Jenssegers\Mongodb\Query\Builder + */ + protected function getCollection() { + return $this->resolver->connection($this->database)->collection($this->collection); + } +} From fcd01a635652c92a8129585c8262e194cfc01f69 Mon Sep 17 00:00:00 2001 From: khoa Date: Mon, 15 Feb 2016 03:15:51 +0000 Subject: [PATCH 2/4] CS --- src/Jenssegers/Mongodb/MongodbServiceProvider.php | 2 +- .../Mongodb/Queue/Failed/DatabaseFailedJobProvider.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Jenssegers/Mongodb/MongodbServiceProvider.php b/src/Jenssegers/Mongodb/MongodbServiceProvider.php index 86c683316..485b46ba7 100644 --- a/src/Jenssegers/Mongodb/MongodbServiceProvider.php +++ b/src/Jenssegers/Mongodb/MongodbServiceProvider.php @@ -35,7 +35,7 @@ public function register() }); // Support queue failer to record failed jobs - $this->app->bindShared('queue.failer', function($app) + $this->app->bindShared('queue.failer', function ($app) { $config = $app['config']['queue.failed']; return new DatabaseFailedJobProvider($app['db'], $config['database'], $config['collection']); diff --git a/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php b/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php index b660bd43c..8bdd2f6cb 100644 --- a/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php +++ b/src/Jenssegers/Mongodb/Queue/Failed/DatabaseFailedJobProvider.php @@ -87,7 +87,7 @@ public function find($id) { unset($fail['_id']); return (object) $fail; } - return NULL; + return $fail; } /** From 4f59e6575e66319a3f4d83887df5e469450f30a8 Mon Sep 17 00:00:00 2001 From: khoa Date: Mon, 15 Feb 2016 03:41:43 +0000 Subject: [PATCH 3/4] resolve to NullFailedJobProvider if collection is not defined --- src/Jenssegers/Mongodb/MongodbServiceProvider.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Jenssegers/Mongodb/MongodbServiceProvider.php b/src/Jenssegers/Mongodb/MongodbServiceProvider.php index 485b46ba7..50df7cc10 100644 --- a/src/Jenssegers/Mongodb/MongodbServiceProvider.php +++ b/src/Jenssegers/Mongodb/MongodbServiceProvider.php @@ -35,10 +35,14 @@ public function register() }); // Support queue failer to record failed jobs - $this->app->bindShared('queue.failer', function ($app) - { + $this->app->singleton('queue.failer', function ($app) { $config = $app['config']['queue.failed']; - return new DatabaseFailedJobProvider($app['db'], $config['database'], $config['collection']); + + if (isset($config['collection'])) { + return new DatabaseFailedJobProvider($app['db'], $config['database'], $config['collection']); + } else { + return new NullFailedJobProvider; + } }); } } From 73ae83b93548b12f70ffe43dd8afaf9f22dbd962 Mon Sep 17 00:00:00 2001 From: khoa Date: Tue, 16 Feb 2016 14:12:44 +0000 Subject: [PATCH 4/4] Declare correct ns for DatabaseFailedJobProvider --- src/Jenssegers/Mongodb/MongodbServiceProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Jenssegers/Mongodb/MongodbServiceProvider.php b/src/Jenssegers/Mongodb/MongodbServiceProvider.php index 50df7cc10..5e4e0eb4c 100644 --- a/src/Jenssegers/Mongodb/MongodbServiceProvider.php +++ b/src/Jenssegers/Mongodb/MongodbServiceProvider.php @@ -1,7 +1,9 @@