@@ -19,8 +19,12 @@ abstract protected function getContext(): DbalContext;
1919
2020 abstract protected function getConnection (): Connection ;
2121
22- protected function fetchMessage (array $ queues , int $ redeliveryDelay ): ?array
22+ protected function fetchMessage (array $ queues , int $ redeliveryDelay ): ?DbalMessage
2323 {
24+ if (empty ($ queues )) {
25+ throw new \LogicException ('Queues must not be empty. ' );
26+ }
27+
2428 $ now = time ();
2529 $ deliveryId = Uuid ::uuid1 ();
2630
@@ -34,8 +38,8 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?array
3438 ->andWhere ('delivery_id IS NULL ' )
3539 ->addOrderBy ('priority ' , 'asc ' )
3640 ->addOrderBy ('published_at ' , 'asc ' )
41+ ->setParameter ('queues ' , $ queues , Connection::PARAM_STR_ARRAY )
3742 ->setParameter ('delayedUntil ' , $ now , ParameterType::INTEGER )
38- ->setParameter ('queues ' , array_values ($ queues ), Connection::PARAM_STR_ARRAY )
3943 ->setMaxResults (1 );
4044
4145 $ update = $ this ->getConnection ()->createQueryBuilder ()
@@ -44,11 +48,11 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?array
4448 ->set ('redeliver_after ' , ':redeliverAfter ' )
4549 ->andWhere ('id = :messageId ' )
4650 ->andWhere ('delivery_id IS NULL ' )
47- ->setParameter ('deliveryId ' , $ deliveryId ->getBytes (), Type::BINARY )
51+ ->setParameter ('deliveryId ' , $ deliveryId ->getBytes (), Type::GUID )
4852 ->setParameter ('redeliverAfter ' , $ now + $ redeliveryDelay , Type::BIGINT )
4953 ;
5054
51- while (microtime (true ) >= $ endAt ) {
55+ while (microtime (true ) < $ endAt ) {
5256 $ result = $ select ->execute ()->fetch ();
5357 if (empty ($ result )) {
5458 return null ;
@@ -63,7 +67,7 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?array
6367 ->select ('* ' )
6468 ->from ($ this ->getContext ()->getTableName ())
6569 ->andWhere ('delivery_id = :deliveryId ' )
66- ->setParameter ('deliveryId ' , $ deliveryId ->getBytes (), Type::BINARY )
70+ ->setParameter ('deliveryId ' , $ deliveryId ->getBytes (), Type::GUID )
6771 ->setMaxResults (1 )
6872 ->execute ()
6973 ->fetch ()
@@ -73,7 +77,9 @@ protected function fetchMessage(array $queues, int $redeliveryDelay): ?array
7377 throw new \LogicException ('There must be a message at all times at this stage but there is no a message. ' );
7478 }
7579
76- return $ deliveredMessage ;
80+ if ($ deliveredMessage ['redelivered ' ] || empty ($ deliveredMessage ['time_to_live ' ]) || $ deliveredMessage ['time_to_live ' ] > time ()) {
81+ return $ this ->getContext ()->convertMessage ($ deliveredMessage );
82+ }
7783 }
7884 }
7985
@@ -95,7 +101,7 @@ protected function redeliverMessages(): void
95101 ->andWhere ('redeliver_after < :now ' )
96102 ->andWhere ('delivery_id IS NOT NULL ' )
97103 ->setParameter (':now ' , time (), Type::BIGINT )
98- ->setParameter ('deliveryId ' , null , Type::BINARY )
104+ ->setParameter ('deliveryId ' , null , Type::GUID )
99105 ->setParameter ('redelivered ' , true , Type::BOOLEAN )
100106 ;
101107
@@ -112,17 +118,30 @@ protected function removeExpiredMessages(): void
112118 return ;
113119 }
114120
115- $ update = $ this ->getConnection ()->createQueryBuilder ()
121+ $ delete = $ this ->getConnection ()->createQueryBuilder ()
116122 ->delete ($ this ->getContext ()->getTableName ())
117123 ->andWhere ('(time_to_live IS NOT NULL) AND (time_to_live < :now) ' )
118124 ->andWhere ('delivery_id IS NULL ' )
119125 ->andWhere ('redelivered = false ' )
120126
121- ->setParameter (':now ' , ( int ) time (), Type::BIGINT )
127+ ->setParameter (':now ' , time (), Type::BIGINT )
122128 ;
123129
124- $ update ->execute ();
130+ $ delete ->execute ();
125131
126132 $ this ->removeExpiredMessagesLastExecutedAt = microtime (true );
127133 }
134+
135+ private function deleteMessage (string $ deliveryId ): void
136+ {
137+ if (empty ($ deliveryId )) {
138+ throw new \LogicException (sprintf ('Expected record was removed but it is not. Delivery id: "%s" ' , $ deliveryId ));
139+ }
140+
141+ $ this ->getConnection ()->delete (
142+ $ this ->getContext ()->getTableName (),
143+ ['delivery_id ' => Uuid ::fromString ($ deliveryId )->getBytes ()],
144+ ['delivery_id ' => Type::GUID ]
145+ );
146+ }
128147}
0 commit comments