UniqueLock.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace Illuminate\Bus;
  3. use Illuminate\Contracts\Cache\Repository as Cache;
  4. class UniqueLock
  5. {
  6. /**
  7. * The cache repository implementation.
  8. *
  9. * @var \Illuminate\Contracts\Cache\Repository
  10. */
  11. protected $cache;
  12. /**
  13. * Create a new unique lock manager instance.
  14. *
  15. * @param \Illuminate\Contracts\Cache\Repository $cache
  16. * @return void
  17. */
  18. public function __construct(Cache $cache)
  19. {
  20. $this->cache = $cache;
  21. }
  22. /**
  23. * Attempt to acquire a lock for the given job.
  24. *
  25. * @param mixed $job
  26. * @return bool
  27. */
  28. public function acquire($job)
  29. {
  30. $uniqueFor = method_exists($job, 'uniqueFor')
  31. ? $job->uniqueFor()
  32. : ($job->uniqueFor ?? 0);
  33. $cache = method_exists($job, 'uniqueVia')
  34. ? $job->uniqueVia()
  35. : $this->cache;
  36. return (bool) $cache->lock($this->getKey($job), $uniqueFor)->get();
  37. }
  38. /**
  39. * Release the lock for the given job.
  40. *
  41. * @param mixed $job
  42. * @return void
  43. */
  44. public function release($job)
  45. {
  46. $cache = method_exists($job, 'uniqueVia')
  47. ? $job->uniqueVia()
  48. : $this->cache;
  49. $cache->lock($this->getKey($job))->forceRelease();
  50. }
  51. /**
  52. * Generate the lock key for the given job.
  53. *
  54. * @param mixed $job
  55. * @return string
  56. */
  57. protected function getKey($job)
  58. {
  59. $uniqueId = method_exists($job, 'uniqueId')
  60. ? $job->uniqueId()
  61. : ($job->uniqueId ?? '');
  62. return 'laravel_unique_job:'.get_class($job).':'.$uniqueId;
  63. }
  64. }