【发布时间】:2019-04-04 03:28:50
【问题描述】:
我的工作在本地完美无缺,但在生产中我遇到了无法正常工作的问题。我已经用try/catch 包含了整个handle() 并且没有看到任何记录到Bugsnag 的内容,尽管在其他地方部署了许多其他例外情况。
public function handle() {
try {
// do stuff
} catch (\Exception $e) {
Bugsnag::notifyException($e);
throw $e;
}
}
根据Laravel Horizon,此队列作业运行0.0026001930236816406 秒,我从未看到它工作,也从未在failed_jobs 表中看到与此作业相关的任何其他错误。
config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => (60 * 10), // 10 minutes
'block_for' => null,
],
config/horizon.php
'environments' => [
'production' => [
'supervisor' => [
'connection' => 'redis',
'queue' => [
'default',
],
'balance' => 'auto',
'processes' => 10,
'tries' => 3,
// 10 seconds under the queue's retry_after to avoid overlap
'timeout' => (60 * 10) - 10, // Just under 10 mins
],
如果某些原因导致此作业反复重试,我该如何找出原因?我很茫然。
调查至今
- 我的期望是我应该能够运行查询:
SELECT DISTINCT exception, COUNT(id) as errors
FROM failed_jobs
WHERE payload LIKE '%[TAG-JOB-HAS]%'
GROUP BY exception;
要查看更多信息:
作业尝试次数过多或运行时间过长
但这就是我所看到的。
- Laravel Horizon 的仪表板显示有问题的作业运行时间
【问题讨论】:
-
您是否尝试过记录调试语句以证明作业已实际运行?您能否提供有关该工作实际执行的更多信息,也许还有一些代码?它可能以不会产生异常的方式失败
-
"...但是在生产中我遇到了它不起作用的问题" - 什么不起作用?您在日志中看到错误吗?
-
只是想一想,是不是
Bugsnag::notifyException($e)行导致了异常,导致 Laravel 重新排队你的工作重试? -
什么是“
// do stuff”?它会做一些奇怪的事情吗,比如调用 exit() 或 die()? -
handle函数添加try catch后是否重启了队列?
标签: laravel queue laravel-horizon