diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php
index 14d9a599ae011..4fe0b7f88027c 100644
--- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php
+++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php
@@ -9,8 +9,8 @@
*/
namespace Magento\Cron\Observer;
-use Laminas\Http\PhpEnvironment\Request as Environment;
use Exception;
+use Laminas\Http\PhpEnvironment\Request as Environment;
use Magento\Cron\Model\DeadlockRetrierInterface;
use Magento\Cron\Model\ResourceModel\Schedule\Collection as ScheduleCollection;
use Magento\Cron\Model\Schedule;
@@ -184,6 +184,11 @@ class ProcessCronQueueObserver implements ObserverInterface
*/
private $retrier;
+ /**
+ * @var array
+ */
+ private $ignoreMismatches = [];
+
/**
* @param \Magento\Framework\ObjectManagerInterface $objectManager
* @param \Magento\Cron\Model\ScheduleFactory $scheduleFactory
@@ -201,6 +206,7 @@ class ProcessCronQueueObserver implements ObserverInterface
* @param \Magento\Framework\Event\ManagerInterface $eventManager
* @param DeadlockRetrierInterface $retrier
* @param Environment $environment
+ * @param array $ignoreMismatches
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
@@ -219,7 +225,8 @@ public function __construct(
\Magento\Framework\Lock\LockManagerInterface $lockManager,
\Magento\Framework\Event\ManagerInterface $eventManager,
DeadlockRetrierInterface $retrier,
- Environment $environment
+ Environment $environment,
+ array $ignoreMismatches = []
) {
$this->_objectManager = $objectManager;
$this->_scheduleFactory = $scheduleFactory;
@@ -237,6 +244,7 @@ public function __construct(
$this->lockManager = $lockManager;
$this->eventManager = $eventManager;
$this->retrier = $retrier;
+ $this->ignoreMismatches = $ignoreMismatches;
}
/**
@@ -789,6 +797,9 @@ private function getCronExpression($jobConfig)
private function cleanupScheduleMismatches()
{
foreach ($this->invalid as $jobCode => $scheduledAtList) {
+ if (in_array($jobCode, $this->ignoreMismatches)) {
+ continue;
+ }
$this->cleanup(
[
'status = ?' => Schedule::STATUS_PENDING,
diff --git a/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php b/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php
new file mode 100644
index 0000000000000..d2095d3d68369
--- /dev/null
+++ b/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php
@@ -0,0 +1,102 @@
+scheduleFactory = $scheduleFactory;
+ $this->dateTime = $dateTime;
+ $this->logger = $logger;
+ $this->scopeConfig = $scopeConfig;
+ }
+
+ /**
+ * Set cron for order pending payment
+ *
+ * @param \Magento\Framework\Event\Observer $observer
+ * @return $this|void
+ */
+ public function execute(\Magento\Framework\Event\Observer $observer)
+ {
+ if ($this->isStart) {
+ return $this;
+ }
+
+ $order = $observer->getEvent()->getOrder();
+ if (!$order->getId() || $order->getStatus() !== Order::STATE_PENDING_PAYMENT) {
+ return $this;
+ }
+
+ $lifetime = $this->scopeConfig->getValue(
+ self::XML_PATH_ORDER_DELETE_PENDING,
+ ScopeInterface::SCOPE_WEBSITES,
+ $order->getStore()->getWebsite()->getId()
+ );
+ $currentTime = $this->dateTime->gmtTimestamp();
+ try {
+ $schedule = $this->scheduleFactory->create()
+ ->setJobCode('sales_clean_orders')
+ ->setStatus(Schedule::STATUS_PENDING)
+ ->setCreatedAt(date('Y-m-d H:i:s', $currentTime))
+ ->setScheduledAt(date('Y-m-d H:i', $currentTime + $lifetime * 60));
+
+ $schedule->save();
+ $this->isStart = true;
+ } catch (\Exception $e) {
+ $this->logger->critical($e);
+ }
+ }
+}
diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml
index d5dc1938bdab5..30d76c694e69d 100644
--- a/app/code/Magento/Sales/etc/di.xml
+++ b/app/code/Magento/Sales/etc/di.xml
@@ -1038,4 +1038,11 @@
+
+
+
+ - sales_clean_orders
+
+
+
diff --git a/app/code/Magento/Sales/etc/events.xml b/app/code/Magento/Sales/etc/events.xml
index b3a7a4ab99577..29094d589de07 100644
--- a/app/code/Magento/Sales/etc/events.xml
+++ b/app/code/Magento/Sales/etc/events.xml
@@ -56,4 +56,7 @@
name="sales_assign_order_to_customer"
instance="Magento\Sales\Observer\AssignOrderToCustomerObserver" />
+
+
+
diff --git a/app/code/Magento/Sales/etc/module.xml b/app/code/Magento/Sales/etc/module.xml
index 11eebaa3d5a3d..cbb154c7951ad 100644
--- a/app/code/Magento/Sales/etc/module.xml
+++ b/app/code/Magento/Sales/etc/module.xml
@@ -13,6 +13,7 @@
+