Skip to content

Commit c0983c9

Browse files
committed
ACP2E-3387: [Cloud] Magento: queue message has been deleted
1 parent b78b3e7 commit c0983c9

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

app/code/Magento/MysqlMq/Model/ResourceModel/Queue.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,39 @@
77

88
use Magento\Framework\DB\Select;
99
use Magento\Framework\DB\Sql\Expression;
10+
use Magento\Framework\Model\ResourceModel\Db\Context;
1011
use Magento\MysqlMq\Model\QueueManagement;
1112

1213
/**
1314
* Resource model for queue.
1415
*/
1516
class Queue extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
1617
{
18+
/**
19+
*
20+
*/
21+
private const CHUNK_SIZE = 10000;
22+
23+
/**
24+
* @var int|mixed
25+
*/
26+
private int $chunkSize;
27+
28+
/**
29+
* @param Context $context
30+
* @param null $connectionName
31+
* @param int|null $chunkSize
32+
*/
33+
public function __construct(Context $context, $connectionName = null, int $chunkSize = null)
34+
{
35+
parent::__construct($context, $connectionName);
36+
if ($chunkSize) {
37+
$this->chunkSize = $chunkSize;
38+
} else {
39+
$this->chunkSize = self::CHUNK_SIZE;
40+
}
41+
}
42+
1743
/**
1844
* Model initialization
1945
*
@@ -170,13 +196,20 @@ public function getMessages($queueName, $limit = null)
170196
public function deleteMarkedMessages(): void
171197
{
172198
$connection = $this->getConnection();
173-
174199
$select = $connection->select()
175200
->from(['queue_message_status' => $this->getMessageStatusTable()], ['message_id'])
176-
->where('status = ?', QueueManagement::MESSAGE_STATUS_TO_BE_DELETED)
201+
->joinLeft(
202+
['message_status2' => $this->getMessageStatusTable()],
203+
'queue_message_status.message_id = message_status2.message_id AND message_status2.status <> ' .
204+
QueueManagement::MESSAGE_STATUS_TO_BE_DELETED,
205+
[]
206+
)
207+
->where('queue_message_status.status = ?', QueueManagement::MESSAGE_STATUS_TO_BE_DELETED)
208+
->where('message_status2.message_id IS NULL')
177209
->distinct();
210+
178211
$messageIds = $connection->fetchCol($select);
179-
foreach (array_chunk($messageIds, 10000) as $messageIdsChunk) {
212+
foreach (array_chunk($messageIds, $this->chunkSize) as $messageIdsChunk) {
180213
$connection->delete($this->getMessageTable(), ['id IN (?)' => $messageIdsChunk]);
181214
}
182215
}

app/code/Magento/MysqlMq/Test/Unit/Model/ResourceModel/QueueTest.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -286,21 +286,15 @@ function ($arg1, $arg2) use ($tableNames) {
286286
$select->expects($this->once())
287287
->method('from')->with(['queue_message_status' => $tableNames[0]], ['message_id'])->willReturnSelf();
288288
$select->expects($this->once())->method('where')
289-
->with('status <> ?', QueueManagement::MESSAGE_STATUS_TO_BE_DELETED)
289+
->with('status = ?', QueueManagement::MESSAGE_STATUS_TO_BE_DELETED)
290290
->willReturnSelf();
291291
$select->expects($this->once())->method('distinct')->willReturnSelf();
292-
$select->expects($this->once())
293-
->method('assemble')
294-
->willReturn(
295-
'SELECT message_id FROM queue_message_status WHERE status = ' .
296-
QueueManagement::MESSAGE_STATUS_TO_BE_DELETED
297-
);
292+
$connection->expects($this->once())->method('fetchCol')->with($select)->willReturn([1, 2]);
298293

299294
$connection->expects($this->once())->method('delete')
300295
->with(
301296
$tableNames[1],
302-
'id NOT IN (SELECT message_id FROM queue_message_status WHERE status = ' .
303-
QueueManagement::MESSAGE_STATUS_TO_BE_DELETED . ')'
297+
['id IN (?)' => [1,2]]
304298
)->willReturn(2);
305299
$this->queue->deleteMarkedMessages();
306300
}

0 commit comments

Comments
 (0)