Skip to content

Commit 5b417e9

Browse files
author
Bartosz Kubicki
committed
Making message lock release possible
1 parent 04b376d commit 5b417e9

File tree

4 files changed

+106
-49
lines changed

4 files changed

+106
-49
lines changed
Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,42 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* Copyright © Magento, Inc. All rights reserved.
47
* See COPYING.txt for license details.
58
*/
69
namespace Magento\MessageQueue\Model\ResourceModel;
710

8-
use \Magento\Framework\MessageQueue\Lock\ReaderInterface;
9-
use \Magento\Framework\MessageQueue\Lock\WriterInterface;
11+
use DateInterval;
12+
use DateTime;
13+
use Exception;
14+
use Magento\Framework\MessageQueue\Lock\ReaderInterface;
15+
use Magento\Framework\MessageQueue\Lock\WriterInterface;
16+
use Magento\Framework\MessageQueue\LockInterface;
17+
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
18+
use Magento\Framework\Model\ResourceModel\Db\Context;
19+
use Magento\Framework\Stdlib\DateTime\DateTime as MagentoDateTime;
20+
use Magento\MessageQueue\Model\Lock as LockModel;
21+
use Magento\MessageQueue\Model\LockFactory;
1022

1123
/**
1224
* Class Lock to handle database lock table db transactions.
1325
*/
14-
class Lock extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements ReaderInterface, WriterInterface
26+
class Lock extends AbstractDb implements ReaderInterface, WriterInterface
1527
{
16-
/**#@+
17-
* Constants
28+
/**
29+
* @var string
1830
*/
19-
const QUEUE_LOCK_TABLE = 'queue_lock';
20-
/**#@-*/
31+
private const QUEUE_LOCK_TABLE = 'queue_lock';
2132

22-
/**#@-*/
33+
/**
34+
* @var MagentoDateTime
35+
*/
2336
private $dateTime;
2437

2538
/**
26-
* @var \Magento\MessageQueue\Model\LockFactory
39+
* @var LockFactory
2740
*/
2841
private $lockFactory;
2942

@@ -35,18 +48,18 @@ class Lock extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implemen
3548
/**
3649
* Initialize dependencies.
3750
*
38-
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
39-
* @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
40-
* @param \Magento\MessageQueue\Model\LockFactory $lockFactory
41-
* @param null $connectionName
51+
* @param Context $context
52+
* @param MagentoDateTime $dateTime
53+
* @param LockFactory $lockFactory
54+
* @param string|null $connectionName
4255
* @param integer $interval
4356
*/
4457
public function __construct(
45-
\Magento\Framework\Model\ResourceModel\Db\Context $context,
46-
\Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
47-
\Magento\MessageQueue\Model\LockFactory $lockFactory,
48-
$connectionName = null,
49-
$interval = 86400
58+
Context $context,
59+
MagentoDateTime $dateTime,
60+
LockFactory $lockFactory,
61+
?string $connectionName = null,
62+
int $interval = 86400
5063
) {
5164
$this->lockFactory = $lockFactory;
5265
$this->interval = $interval;
@@ -55,43 +68,63 @@ public function __construct(
5568
}
5669

5770
/**
58-
* {@inheritDoc}
71+
* Init.
72+
*
73+
* @return void
74+
*
75+
* @codeCoverageIgnore
76+
* @SuppressWarnings(PHPMD.CamelCaseMethodName)
5977
*/
60-
protected function _construct()
78+
protected function _construct(): void
6179
{
6280
$this->_init(self::QUEUE_LOCK_TABLE, 'id');
6381
}
6482

6583
/**
66-
* {@inheritDoc}
84+
* Read lock
85+
*
86+
* @param LockInterface $lock
87+
* @param string $code
88+
* @return void
6789
*/
68-
public function read(\Magento\Framework\MessageQueue\LockInterface $lock, $code)
90+
public function read(LockInterface $lock, string $code): void
6991
{
92+
/** @var $object LockModel */
7093
$object = $this->lockFactory->create();
71-
$object->load($code, 'message_code');
94+
$this->load($object, $code, 'message_code');
7295
$lock->setId($object->getId());
7396
$lock->setMessageCode($object->getMessageCode() ?: $code);
7497
$lock->setCreatedAt($object->getCreatedAt());
7598
}
7699

77100
/**
78-
* {@inheritDoc}
101+
* Save lock
102+
*
103+
* @param LockInterface $lock
104+
*
105+
* @return void
106+
* @throws Exception
79107
*/
80-
public function saveLock(\Magento\Framework\MessageQueue\LockInterface $lock)
108+
public function saveLock(LockInterface $lock): void
81109
{
110+
/** @var $object LockModel */
82111
$object = $this->lockFactory->create();
83112
$object->setMessageCode($lock->getMessageCode());
84113
$object->setCreatedAt($this->dateTime->gmtTimestamp());
85-
$object->save();
114+
$this->save($object);
115+
$lock->setId($object->getId());
86116
}
87117

88118
/**
89-
* {@inheritDoc}
119+
* Remove outdated locks
120+
*
121+
* @return void
122+
* @throws Exception
90123
*/
91-
public function releaseOutdatedLocks()
124+
public function releaseOutdatedLocks(): void
92125
{
93-
$date = (new \DateTime())->setTimestamp($this->dateTime->gmtTimestamp());
94-
$date->add(new \DateInterval('PT' . $this->interval . 'S'));
126+
$date = (new DateTime())->setTimestamp($this->dateTime->gmtTimestamp());
127+
$date->add(new DateInterval('PT' . $this->interval . 'S'));
95128
$this->getConnection()->delete($this->getTable(self::QUEUE_LOCK_TABLE), ['created_at <= ?' => $date]);
96129
}
97130
}

dev/tests/integration/testsuite/Magento/MessageQueue/Model/Plugin/ResourceModel/LockTest.php

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,68 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* Copyright © Magento, Inc. All rights reserved.
47
* See COPYING.txt for license details.
58
*/
69

710
namespace Magento\MessageQueue\Model\Plugin\ResourceModel;
811

9-
use Magento\TestFramework\Event\Magento;
12+
use Magento\Framework\App\MaintenanceMode;
13+
use Magento\Framework\MessageQueue\Lock\ReaderInterface;
14+
use Magento\Framework\MessageQueue\Lock\WriterInterface;
15+
use Magento\Framework\MessageQueue\LockInterface;
16+
use Magento\Framework\ObjectManagerInterface;
17+
use Magento\TestFramework\Helper\Bootstrap;
18+
use PHPUnit\Framework\TestCase;
1019

11-
class LockTest extends \PHPUnit\Framework\TestCase
20+
class LockTest extends TestCase
1221
{
1322
/**
14-
* @var \Magento\Framework\ObjectManagerInterface
23+
* @var ObjectManagerInterface
1524
*/
1625
protected $objectManager;
1726

1827
/**
19-
* @var \Magento\Framework\MessageQueue\LockInterface
28+
* @var LockInterface
2029
*/
2130
protected $lock;
2231

2332
/**
24-
* @var \Magento\Framework\MessageQueue\Lock\WriterInterface
33+
* @var WriterInterface
2534
*/
2635
protected $writer;
2736

2837
/**
29-
* @var \Magento\Framework\MessageQueue\Lock\ReaderInterface
38+
* @var ReaderInterface
3039
*/
3140
protected $reader;
3241

33-
protected function setUp()
42+
/**
43+
* @return void
44+
*/
45+
protected function setUp(): void
3446
{
35-
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
47+
$this->objectManager = Bootstrap::getObjectManager();
3648

37-
$this->lock = $this->objectManager->get(\Magento\Framework\MessageQueue\LockInterface::class);
38-
$this->writer = $this->objectManager->get(\Magento\Framework\MessageQueue\Lock\WriterInterface::class);
39-
$this->reader = $this->objectManager->get(\Magento\Framework\MessageQueue\Lock\ReaderInterface::class);
49+
$this->lock = $this->objectManager->get(LockInterface::class);
50+
$this->writer = $this->objectManager->get(WriterInterface::class);
51+
$this->reader = $this->objectManager->get(ReaderInterface::class);
4052
}
4153

4254
/**
4355
* Test to ensure Queue Lock Table is cleared when maintenance mode transitions from on to off.
4456
*
4557
* @return void
4658
*/
47-
public function testLockClearedByMaintenanceModeOff()
59+
public function testLockClearedByMaintenanceModeOff(): void
4860
{
49-
/** @var $maintenanceMode \Magento\Framework\App\MaintenanceMode */
50-
$maintenanceMode = $this->objectManager->get(\Magento\Framework\App\MaintenanceMode::class);
61+
/** @var $maintenanceMode MaintenanceMode */
62+
$maintenanceMode = $this->objectManager->get(MaintenanceMode::class);
63+
// phpcs:disable
5164
$code = md5('consumer.name-1');
65+
// phpcs:enable
5266
$this->lock->setMessageCode($code);
5367
$this->writer->saveLock($this->lock);
5468
$this->reader->read($this->lock, $code);
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* Copyright © Magento, Inc. All rights reserved.
47
* See COPYING.txt for license details.
58
*/
69
namespace Magento\Framework\MessageQueue\Lock;
710

11+
use Magento\Framework\MessageQueue\LockInterface;
12+
813
/**
914
* Message lock reader interface
1015
*/
@@ -13,9 +18,9 @@ interface ReaderInterface
1318
/**
1419
* Get lock from storage
1520
*
16-
* @param \Magento\Framework\MessageQueue\LockInterface $lock
21+
* @param LockInterface $lock
1722
* @param string $code
1823
* @return void
1924
*/
20-
public function read(\Magento\Framework\MessageQueue\LockInterface $lock, $code);
25+
public function read(LockInterface $lock, string $code): void;
2126
}
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* Copyright © Magento, Inc. All rights reserved.
47
* See COPYING.txt for license details.
58
*/
69
namespace Magento\Framework\MessageQueue\Lock;
710

11+
use Magento\Framework\MessageQueue\LockInterface;
12+
813
/**
914
* Message lock writer
1015
*/
@@ -13,15 +18,15 @@ interface WriterInterface
1318
/**
1419
* Save lock
1520
*
16-
* @param \Magento\Framework\MessageQueue\LockInterface $lock
21+
* @param LockInterface $lock
1722
* @return void
1823
*/
19-
public function saveLock(\Magento\Framework\MessageQueue\LockInterface $lock);
24+
public function saveLock(LockInterface $lock): void;
2025

2126
/**
2227
* Remove outdated locks
2328
*
2429
* @return void
2530
*/
26-
public function releaseOutdatedLocks();
31+
public function releaseOutdatedLocks(): void;
2732
}

0 commit comments

Comments
 (0)