Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace crmeb\basic;
  3. use crmeb\interfaces\JobInterface;
  4. use think\facade\Log;
  5. use think\queue\Job;
  6. /**
  7. * 消息队列基类
  8. * Class BaseJobs
  9. */
  10. class BaseJobs implements JobInterface
  11. {
  12. /**
  13. * @param $name
  14. * @param $arguments
  15. */
  16. public function __call($name, $arguments)
  17. {
  18. $this->fire(...$arguments);
  19. }
  20. /**
  21. * 运行消息队列
  22. * @param Job $job
  23. * @param $data
  24. */
  25. public function fire(Job $job, $data): void
  26. {
  27. try {
  28. $action = $data['do'] ?? 'doJob';//任务名
  29. $infoData = $data['data'] ?? [];//执行数据
  30. $errorCount = $data['errorCount'] ?? 0;//最大错误次数
  31. $this->runJob($action, $job, $infoData, $errorCount);
  32. } catch (\Throwable $e) {
  33. $job->delete();
  34. }
  35. }
  36. /**
  37. * 执行队列
  38. * @param string $action
  39. * @param Job $job
  40. * @param array $infoData
  41. * @param int $errorCount
  42. */
  43. protected function runJob(string $action, Job $job, array $infoData, int $errorCount = 3)
  44. {
  45. $action = method_exists($this, $action) ? $action : 'handle';
  46. if (!method_exists($this, $action)) {
  47. $job->delete();
  48. }
  49. if ($this->{$action}(...$infoData)) {
  50. //删除任务
  51. $job->delete();
  52. } else {
  53. if ($job->attempts() >= $errorCount && $errorCount) {
  54. //删除任务
  55. $job->delete();
  56. } else {
  57. //从新放入队列
  58. $job->release();
  59. }
  60. }
  61. }
  62. }