Lock.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\MessageQueue\Model\ResourceModel;
  7. use \Magento\Framework\MessageQueue\Lock\ReaderInterface;
  8. use \Magento\Framework\MessageQueue\Lock\WriterInterface;
  9. /**
  10. * Class Lock to handle database lock table db transactions.
  11. */
  12. class Lock extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements ReaderInterface, WriterInterface
  13. {
  14. /**#@+
  15. * Constants
  16. */
  17. const QUEUE_LOCK_TABLE = 'queue_lock';
  18. /**#@-*/
  19. /**#@-*/
  20. private $dateTime;
  21. /**
  22. * @var \Magento\MessageQueue\Model\LockFactory
  23. */
  24. private $lockFactory;
  25. /**
  26. * @var integer
  27. */
  28. private $interval;
  29. /**
  30. * Initialize dependencies.
  31. *
  32. * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
  33. * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
  34. * @param \Magento\MessageQueue\Model\LockFactory $lockFactory
  35. * @param null $connectionName
  36. * @param integer $interval
  37. */
  38. public function __construct(
  39. \Magento\Framework\Model\ResourceModel\Db\Context $context,
  40. \Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
  41. \Magento\MessageQueue\Model\LockFactory $lockFactory,
  42. $connectionName = null,
  43. $interval = 86400
  44. ) {
  45. $this->lockFactory = $lockFactory;
  46. $this->interval = $interval;
  47. $this->dateTime = $dateTime;
  48. parent::__construct($context, $connectionName);
  49. }
  50. /**
  51. * {@inheritDoc}
  52. */
  53. protected function _construct()
  54. {
  55. $this->_init(self::QUEUE_LOCK_TABLE, 'id');
  56. }
  57. /**
  58. * {@inheritDoc}
  59. */
  60. public function read(\Magento\Framework\MessageQueue\LockInterface $lock, $code)
  61. {
  62. $object = $this->lockFactory->create();
  63. $object->load($code, 'message_code');
  64. $lock->setId($object->getId());
  65. $lock->setMessageCode($object->getMessageCode() ?: $code);
  66. $lock->setCreatedAt($object->getCreatedAt());
  67. }
  68. /**
  69. * {@inheritDoc}
  70. */
  71. public function saveLock(\Magento\Framework\MessageQueue\LockInterface $lock)
  72. {
  73. $object = $this->lockFactory->create();
  74. $object->setMessageCode($lock->getMessageCode());
  75. $object->setCreatedAt($this->dateTime->gmtTimestamp());
  76. $object->save();
  77. }
  78. /**
  79. * {@inheritDoc}
  80. */
  81. public function releaseOutdatedLocks()
  82. {
  83. $date = (new \DateTime())->setTimestamp($this->dateTime->gmtTimestamp());
  84. $date->add(new \DateInterval('PT' . $this->interval . 'S'));
  85. $this->getConnection()->delete($this->getTable(self::QUEUE_LOCK_TABLE), ['created_at <= ?' => $date]);
  86. }
  87. }