<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Kevin Bui on Medium]]></title>
        <description><![CDATA[Stories by Kevin Bui on Medium]]></description>
        <link>https://medium.com/@longbuihoang?source=rss-ec33fb9b61e5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*Y7w-5z-9vZhB_79x</url>
            <title>Stories by Kevin Bui on Medium</title>
            <link>https://medium.com/@longbuihoang?source=rss-ec33fb9b61e5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 06 Jun 2026 11:07:51 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@longbuihoang/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Laravel — Storing Failed Jobs In A Json File]]></title>
            <link>https://medium.com/@longbuihoang/laravel-storing-failed-jobs-in-a-json-file-4c8edc3f0627?source=rss-ec33fb9b61e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/4c8edc3f0627</guid>
            <category><![CDATA[laravel-development]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[laravel-11]]></category>
            <category><![CDATA[laravel-queue]]></category>
            <category><![CDATA[laravel-framework]]></category>
            <dc:creator><![CDATA[Kevin Bui]]></dc:creator>
            <pubDate>Mon, 04 Nov 2024 13:34:02 GMT</pubDate>
            <atom:updated>2024-11-04T13:52:30.193Z</atom:updated>
            <content:encoded><![CDATA[<h3>Laravel — Storing Failed Jobs In A Json File</h3><p>Failed queued jobs in Laravel are typically stored in the failed_jobs table.</p><p>Being a big fan of Laravel, I regularly read the source code, picking up secret features and occasionally contribute.</p><p>Lately, I have found out that there is an alternative to storing failed jobs in Laravel. which is a JSON file!</p><h3>1. Configurations:</h3><p>In the <strong>config/queue.php</strong>, this is the default configuration:</p><pre>[<br>    //...<br>    &#39;failed&#39; =&gt; [<br>        &#39;driver&#39; =&gt; env(&#39;QUEUE_FAILED_DRIVER&#39;, &#39;database-uuids&#39;),<br>        &#39;database&#39; =&gt; env(&#39;DB_CONNECTION&#39;, &#39;sqlite&#39;),<br>        &#39;table&#39; =&gt; &#39;failed_jobs&#39;,<br>    ],<br>];</pre><p>In the <strong>.env</strong> file, we will set the <strong>QUEUE_FAILED_DRIVER</strong> variable to be <strong>file</strong>:</p><pre>QUEUE_FAILED_DRIVER=file</pre><p>That’s all we have to do! Now, lets test storing the failed jobs in a JSON file.</p><h3>2. Test Storing Failed Jobs To JSON Files:</h3><p>Now, I define a minimal, simple job that will always fail.</p><pre>&lt;?php<br><br>namespace App\Jobs;<br><br>use Illuminate\Contracts\Queue\ShouldQueue;<br>use Illuminate\Foundation\Queue\Queueable;<br><br>class ThisJobWillFail implements ShouldQueue<br>{<br>    use Queueable;<br><br>    /**<br>     * Execute the job.<br>     */<br>    public function handle(): void<br>    {<br>        $this-&gt;fail(&#39;This job will always fail.&#39;);<br>    }<br>}</pre><p>I dispatch this job 3 times:</p><pre>use App\Jobs\ThisJobWillFail;<br>use Queue;<br><br>ThisJobWillFail::dispatch();<br>ThisJobWillFail::dispatch();<br>ThisJobWillFail::dispatch();<br><br>// Or<br>Queue::bulk([<br>    new ThisJobWillFail(),<br>    new ThisJobWillFail(),<br>    new ThisJobWillFail(),<br>]);</pre><p>Then, obviously we need to run the queue worker:</p><pre>php artisan queue:work<br><br>   INFO  Processing jobs from the [default] queue.<br><br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... RUNNING<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 5.30ms FAIL<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 11.90ms DONE<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... RUNNING<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 1.74ms FAIL<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 3.62ms DONE<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... RUNNING<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 1.59ms FAIL<br>  2024-11-04 12:32:17 App\Jobs\ThisJobWillFail .......... 3.26ms DONE</pre><p>Now, opening the <strong>storage/framework/cache/failed-jobs.json</strong>, we have all the jobs the previously failed!</p><pre>[<br>    {<br>        &quot;id&quot;: &quot;3bbd74b2-dbfe-4b95-b7f6-b6be807ed8bf&quot;,<br>        &quot;connection&quot;: &quot;database&quot;,<br>        &quot;queue&quot;: &quot;default&quot;,<br>        &quot;payload&quot;: &quot;{\&quot;uuid\&quot;:\&quot;3bbd74b2-dbfe-4b95-b7f6-b6be807ed8bf\&quot;,\&quot;displayName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;job\&quot;:\&quot;Illuminate\\\\Queue\\\\CallQueuedHandler@call\&quot;,\&quot;maxTries\&quot;:null,\&quot;maxExceptions\&quot;:null,\&quot;failOnTimeout\&quot;:false,\&quot;backoff\&quot;:null,\&quot;timeout\&quot;:null,\&quot;retryUntil\&quot;:null,\&quot;data\&quot;:{\&quot;commandName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;command\&quot;:\&quot;O:24:\\\&quot;App\\\\Jobs\\\\ThisJobWillFail\\\&quot;:0:{}\&quot;}}&quot;,<br>        &quot;exception&quot;: &quot;Illuminate\\Queue\\ManuallyFailedException: This job will always fail. in \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/InteractsWithQueue.php:56\nStack trace:\n#0 \/Users\/kevinbui\/Code\/test-laravel-11\/app\/Jobs\/ThisJobWillFail.php(17): App\\Jobs\\ThisJobWillFail-&gt;fail(&#39;This job will a...&#39;)\n#1 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): App\\Jobs\\ThisJobWillFail-&gt;handle()\n#2 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#3 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#4 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#5 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#6 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(128): Illuminate\\Container\\Container-&gt;call(Array)\n#7 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Bus\\Dispatcher-&gt;Illuminate\\Bus\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#8 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#9 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(132): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#10 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(124): Illuminate\\Bus\\Dispatcher-&gt;dispatchNow(Object(App\\Jobs\\ThisJobWillFail), false)\n#11 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Queue\\CallQueuedHandler-&gt;Illuminate\\Queue\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#12 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#13 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(123): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#14 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(71): Illuminate\\Queue\\CallQueuedHandler-&gt;dispatchThroughMiddleware(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(App\\Jobs\\ThisJobWillFail))\n#15 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Jobs\/Job.php(102): Illuminate\\Queue\\CallQueuedHandler-&gt;call(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Array)\n#16 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(440): Illuminate\\Queue\\Jobs\\Job-&gt;fire()\n#17 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(390): Illuminate\\Queue\\Worker-&gt;process(&#39;database&#39;, Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(Illuminate\\Queue\\WorkerOptions))\n#18 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(177): Illuminate\\Queue\\Worker-&gt;runJob(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), &#39;database&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#19 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(148): Illuminate\\Queue\\Worker-&gt;daemon(&#39;database&#39;, &#39;default&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#20 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(131): Illuminate\\Queue\\Console\\WorkCommand-&gt;runWorker(&#39;database&#39;, &#39;default&#39;)\n#21 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): Illuminate\\Queue\\Console\\WorkCommand-&gt;handle()\n#22 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#23 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#24 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#25 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#26 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(213): Illuminate\\Container\\Container-&gt;call(Array)\n#27 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Command\/Command.php(279): Illuminate\\Console\\Command-&gt;execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#28 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(182): Symfony\\Component\\Console\\Command\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#29 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(1047): Illuminate\\Console\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#30 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(316): Symfony\\Component\\Console\\Application-&gt;doRunCommand(Object(Illuminate\\Queue\\Console\\WorkCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#31 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(167): Symfony\\Component\\Console\\Application-&gt;doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#32 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Console\/Kernel.php(197): Symfony\\Component\\Console\\Application-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#33 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Application.php(1203): Illuminate\\Foundation\\Console\\Kernel-&gt;handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#34 \/Users\/kevinbui\/Code\/test-laravel-11\/artisan(13): Illuminate\\Foundation\\Application-&gt;handleCommand(Object(Symfony\\Component\\Console\\Input\\ArgvInput))\n#35 {main}&quot;,<br>        &quot;failed_at&quot;: &quot;2024-11-04 12:32:17&quot;,<br>        &quot;failed_at_timestamp&quot;: 1730723537<br>    },<br>    {<br>        &quot;id&quot;: &quot;42f84bdb-c1fd-4a1b-93c6-24babcf702b3&quot;,<br>        &quot;connection&quot;: &quot;database&quot;,<br>        &quot;queue&quot;: &quot;default&quot;,<br>        &quot;payload&quot;: &quot;{\&quot;uuid\&quot;:\&quot;42f84bdb-c1fd-4a1b-93c6-24babcf702b3\&quot;,\&quot;displayName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;job\&quot;:\&quot;Illuminate\\\\Queue\\\\CallQueuedHandler@call\&quot;,\&quot;maxTries\&quot;:null,\&quot;maxExceptions\&quot;:null,\&quot;failOnTimeout\&quot;:false,\&quot;backoff\&quot;:null,\&quot;timeout\&quot;:null,\&quot;retryUntil\&quot;:null,\&quot;data\&quot;:{\&quot;commandName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;command\&quot;:\&quot;O:24:\\\&quot;App\\\\Jobs\\\\ThisJobWillFail\\\&quot;:0:{}\&quot;}}&quot;,<br>        &quot;exception&quot;: &quot;Illuminate\\Queue\\ManuallyFailedException: This job will always fail. in \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/InteractsWithQueue.php:56\nStack trace:\n#0 \/Users\/kevinbui\/Code\/test-laravel-11\/app\/Jobs\/ThisJobWillFail.php(17): App\\Jobs\\ThisJobWillFail-&gt;fail(&#39;This job will a...&#39;)\n#1 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): App\\Jobs\\ThisJobWillFail-&gt;handle()\n#2 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#3 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#4 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#5 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#6 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(128): Illuminate\\Container\\Container-&gt;call(Array)\n#7 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Bus\\Dispatcher-&gt;Illuminate\\Bus\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#8 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#9 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(132): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#10 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(124): Illuminate\\Bus\\Dispatcher-&gt;dispatchNow(Object(App\\Jobs\\ThisJobWillFail), false)\n#11 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Queue\\CallQueuedHandler-&gt;Illuminate\\Queue\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#12 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#13 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(123): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#14 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(71): Illuminate\\Queue\\CallQueuedHandler-&gt;dispatchThroughMiddleware(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(App\\Jobs\\ThisJobWillFail))\n#15 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Jobs\/Job.php(102): Illuminate\\Queue\\CallQueuedHandler-&gt;call(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Array)\n#16 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(440): Illuminate\\Queue\\Jobs\\Job-&gt;fire()\n#17 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(390): Illuminate\\Queue\\Worker-&gt;process(&#39;database&#39;, Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(Illuminate\\Queue\\WorkerOptions))\n#18 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(177): Illuminate\\Queue\\Worker-&gt;runJob(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), &#39;database&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#19 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(148): Illuminate\\Queue\\Worker-&gt;daemon(&#39;database&#39;, &#39;default&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#20 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(131): Illuminate\\Queue\\Console\\WorkCommand-&gt;runWorker(&#39;database&#39;, &#39;default&#39;)\n#21 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): Illuminate\\Queue\\Console\\WorkCommand-&gt;handle()\n#22 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#23 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#24 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#25 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#26 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(213): Illuminate\\Container\\Container-&gt;call(Array)\n#27 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Command\/Command.php(279): Illuminate\\Console\\Command-&gt;execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#28 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(182): Symfony\\Component\\Console\\Command\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#29 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(1047): Illuminate\\Console\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#30 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(316): Symfony\\Component\\Console\\Application-&gt;doRunCommand(Object(Illuminate\\Queue\\Console\\WorkCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#31 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(167): Symfony\\Component\\Console\\Application-&gt;doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#32 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Console\/Kernel.php(197): Symfony\\Component\\Console\\Application-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#33 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Application.php(1203): Illuminate\\Foundation\\Console\\Kernel-&gt;handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#34 \/Users\/kevinbui\/Code\/test-laravel-11\/artisan(13): Illuminate\\Foundation\\Application-&gt;handleCommand(Object(Symfony\\Component\\Console\\Input\\ArgvInput))\n#35 {main}&quot;,<br>        &quot;failed_at&quot;: &quot;2024-11-04 12:32:17&quot;,<br>        &quot;failed_at_timestamp&quot;: 1730723537<br>    },<br>    {<br>        &quot;id&quot;: &quot;596f3431-335e-49de-9721-0b7db92fa580&quot;,<br>        &quot;connection&quot;: &quot;database&quot;,<br>        &quot;queue&quot;: &quot;default&quot;,<br>        &quot;payload&quot;: &quot;{\&quot;uuid\&quot;:\&quot;596f3431-335e-49de-9721-0b7db92fa580\&quot;,\&quot;displayName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;job\&quot;:\&quot;Illuminate\\\\Queue\\\\CallQueuedHandler@call\&quot;,\&quot;maxTries\&quot;:null,\&quot;maxExceptions\&quot;:null,\&quot;failOnTimeout\&quot;:false,\&quot;backoff\&quot;:null,\&quot;timeout\&quot;:null,\&quot;retryUntil\&quot;:null,\&quot;data\&quot;:{\&quot;commandName\&quot;:\&quot;App\\\\Jobs\\\\ThisJobWillFail\&quot;,\&quot;command\&quot;:\&quot;O:24:\\\&quot;App\\\\Jobs\\\\ThisJobWillFail\\\&quot;:0:{}\&quot;}}&quot;,<br>        &quot;exception&quot;: &quot;Illuminate\\Queue\\ManuallyFailedException: This job will always fail. in \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/InteractsWithQueue.php:56\nStack trace:\n#0 \/Users\/kevinbui\/Code\/test-laravel-11\/app\/Jobs\/ThisJobWillFail.php(17): App\\Jobs\\ThisJobWillFail-&gt;fail(&#39;This job will a...&#39;)\n#1 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): App\\Jobs\\ThisJobWillFail-&gt;handle()\n#2 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#3 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#4 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#5 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#6 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(128): Illuminate\\Container\\Container-&gt;call(Array)\n#7 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Bus\\Dispatcher-&gt;Illuminate\\Bus\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#8 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#9 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Bus\/Dispatcher.php(132): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#10 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(124): Illuminate\\Bus\\Dispatcher-&gt;dispatchNow(Object(App\\Jobs\\ThisJobWillFail), false)\n#11 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(144): Illuminate\\Queue\\CallQueuedHandler-&gt;Illuminate\\Queue\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#12 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline-&gt;Illuminate\\Pipeline\\{closure}(Object(App\\Jobs\\ThisJobWillFail))\n#13 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(123): Illuminate\\Pipeline\\Pipeline-&gt;then(Object(Closure))\n#14 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/CallQueuedHandler.php(71): Illuminate\\Queue\\CallQueuedHandler-&gt;dispatchThroughMiddleware(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(App\\Jobs\\ThisJobWillFail))\n#15 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Jobs\/Job.php(102): Illuminate\\Queue\\CallQueuedHandler-&gt;call(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Array)\n#16 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(440): Illuminate\\Queue\\Jobs\\Job-&gt;fire()\n#17 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(390): Illuminate\\Queue\\Worker-&gt;process(&#39;database&#39;, Object(Illuminate\\Queue\\Jobs\\DatabaseJob), Object(Illuminate\\Queue\\WorkerOptions))\n#18 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Worker.php(177): Illuminate\\Queue\\Worker-&gt;runJob(Object(Illuminate\\Queue\\Jobs\\DatabaseJob), &#39;database&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#19 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(148): Illuminate\\Queue\\Worker-&gt;daemon(&#39;database&#39;, &#39;default&#39;, Object(Illuminate\\Queue\\WorkerOptions))\n#20 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Queue\/Console\/WorkCommand.php(131): Illuminate\\Queue\\Console\\WorkCommand-&gt;runWorker(&#39;database&#39;, &#39;default&#39;)\n#21 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(36): Illuminate\\Queue\\Console\\WorkCommand-&gt;handle()\n#22 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()\n#23 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(95): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))\n#24 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))\n#25 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php(690): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)\n#26 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(213): Illuminate\\Container\\Container-&gt;call(Array)\n#27 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Command\/Command.php(279): Illuminate\\Console\\Command-&gt;execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#28 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Console\/Command.php(182): Symfony\\Component\\Console\\Command\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))\n#29 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(1047): Illuminate\\Console\\Command-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#30 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(316): Symfony\\Component\\Console\\Application-&gt;doRunCommand(Object(Illuminate\\Queue\\Console\\WorkCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#31 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/symfony\/console\/Application.php(167): Symfony\\Component\\Console\\Application-&gt;doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#32 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Console\/Kernel.php(197): Symfony\\Component\\Console\\Application-&gt;run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#33 \/Users\/kevinbui\/Code\/test-laravel-11\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Application.php(1203): Illuminate\\Foundation\\Console\\Kernel-&gt;handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))\n#34 \/Users\/kevinbui\/Code\/test-laravel-11\/artisan(13): Illuminate\\Foundation\\Application-&gt;handleCommand(Object(Symfony\\Component\\Console\\Input\\ArgvInput))\n#35 {main}&quot;,<br>        &quot;failed_at&quot;: &quot;2024-11-04 12:32:17&quot;,<br>        &quot;failed_at_timestamp&quot;: 1730723537<br>    }<br>]</pre><h3>3. How Does It Work?</h3><p>In the <strong>Illuminate\Queue\QueueServiceProvider</strong> class, lets have a look at the <strong>registerFailedJobServices </strong>method:</p><pre>if (isset($config[&#39;driver&#39;]) &amp;&amp; $config[&#39;driver&#39;] === &#39;file&#39;) {<br>    return new FileFailedJobProvider(<br>        $config[&#39;path&#39;] ?? $this-&gt;app-&gt;storagePath(&#39;framework/cache/failed-jobs.json&#39;),<br>        $config[&#39;limit&#39;] ?? 100,<br>        fn () =&gt; $app[&#39;cache&#39;]-&gt;store(&#39;file&#39;),<br>    );<br>} elseif (isset($config[&#39;driver&#39;]) &amp;&amp; $config[&#39;driver&#39;] === &#39;dynamodb&#39;) {<br>    return $this-&gt;dynamoFailedJobProvider($config);<br>} elseif (isset($config[&#39;driver&#39;]) &amp;&amp; $config[&#39;driver&#39;] === &#39;database-uuids&#39;) {<br>    return $this-&gt;databaseUuidFailedJobProvider($config);<br>} elseif (isset($config[&#39;table&#39;])) {<br>    return $this-&gt;databaseFailedJobProvider($config);<br>} else {<br>    return new NullFailedJobProvider;<br>}</pre><p>We notice four storing mechanism here.</p><ul><li>file (which is surprisingly the first check!)</li><li>dynamodb</li><li>database-uuids (using the uuid field to identify jobs)</li><li>database (using the id field to identify jobs)</li></ul><h3>4. Additional Configurations:</h3><p>Reading the above code snippet, we easily recognise two more optional configurations for storing failed jobs with a JSON file:</p><pre>[<br>    //...<br>    &#39;failed&#39; =&gt; [<br>        &#39;driver&#39; =&gt; env(&#39;QUEUE_FAILED_DRIVER&#39;, &#39;file&#39;),<br>        &#39;path&#39; =&gt; env(&#39;QUEUE_FAILED_PATH&#39;, &#39;framework/cache/my-failed-jobs.json&#39;),<br>        &#39;limit&#39; =&gt; env(&#39;QUEUE_FAILED_LIMIT&#39;, 1000),<br>    ],<br>];</pre><h3>5. Viewing Failed Jobs:</h3><p>Similar to any other storing mechanism, we can list all failed jobs from the json file with the <strong>php artisan queue:failed</strong> command:</p><pre>php artisan queue:failed<br><br>2024-11-04 12:32:17 3bbd74b2-dbfe-4b95-b7f6-b6be807ed8bf .......... database@default App\Jobs\ThisJobWillFail<br>2024-11-04 12:32:17 42f84bdb-c1fd-4a1b-93c6-24babcf702b3 .......... database@default App\Jobs\ThisJobWillFail<br>2024-11-04 12:32:17 596f3431-335e-49de-9721-0b7db92fa580 .......... database@default App\Jobs\ThisJobWillFail</pre><p><strong>6. Finally, A Few Thoughts:</strong></p><p>I believe this mechanism would be extremely helpful for projects utilising NoSql or Graph databases. Currently I cannot think of a different approach to store failed jobs for those.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4c8edc3f0627" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>