One of the most stunning features of Magento 2 is cron job that enables you to execute repetitive task periodically without any efforts. You can use this cron job to run various scheduled tasks, like.
- Re-indexing
- Catalog price rules
- Sending newsletters
- Generating Google Sitemaps
- Customer notifications or alert messages
- Auto update currency rates
- Scheduled database logs cleanups
- Cache cleanups
- Generating site maps and more.
With just a date and time you are done with setting up cron. After that, the Magento cronjob manager will list all cron jobs and run it sequentially. When there is a number of cron jobs listed, you don’t know which job is currently in progress. Because of that, sometimes it happens when there is less time between executions of crons, it may create conflictions with one another. That’s the reason we always recommend you to check that particular cron is executed or not?
So, we are back with a super exciting blog that will help you to know which cron job is currently running on your Magento 2 Server using this small piece of code.
In the first step, we need to create a cron using “crontab.xml” file at the following location.
app\code\Vendor\Extension\etc\crontab.xml
<pre class="lang:default decode:true"><!--?xml version="1.0"?--> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd"> <group id="default"> <job name="reviewreminder_cron" instance="Magecomp\Reviewreminder\Cron\Reviewcron" method="execute"> <schedule> */5 * * * *</schedule> </job> </group> </config> </pre>
Now, in second step, we need to create one more file named “Mycronfile.php” at this path.
app\code\Vendor\Extension\Cron\Mycronfile.php
<pre class="lang:default decode:true"><!--?php namespace Vendor\Extension\Cron; class Mycronfile { public $logger; public $cronCollection; public function __construct( \Psr\Log\LoggerInterface $logger, \Vendor\Extension\Model\ResourceModel\Cron\CollectionFactory $cronCollection, ) { $this->logger = $logger; $this->cronCollection = $cronCollection; } public function execute() { try { if ($this->isCronrunning(‘vendor_extension_cronname')) { $this->logger->critical('vendor_extension_cronname Job Run'); return; } //Do YOUR FURTHER LOGIC HERE } catch (\Exception $e) { $this->logger->critical($e->getMessage()); } } public function isCronrunning($croncode) { $currentRunningJob = $this->cronCollection->create() ->addFieldToFilter('job_code', $croncode) ->addFieldToFilter('status', 'running') ->setPageSize(1); if ($currentRunningJob->getSize()) { $jobScheduledAtDate = $this->cronCollection->create() ->addFieldToFilter('job_code', $jobCode) ->addFieldToFilter('scheduled_at', $currentRunningJob->getFirstItem()->getScheduledAt()) ->addFieldToFilter('status', ['in' => ['success', 'failed']]); return ($jobScheduledAtDate->getSize()) ? true : false; } return false; } } </pre>
In this third and last step we need to create cron collection file at this path. app\code\Vendor\Extesnion\Model\ResourceModel\Cron\Collection.php
<pre class="lang:default decode:true"> <!--?php namespace Vendor\Extension\Model\ResourceModel\Cron; class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection { protected $_idFieldName = 'schedule_id'; public function _construct() { $this->_init(\Magento\Cron\Model\Schedule::class, \Magento\Cron\Model\ResourceModel\Schedule::class); } } </pre>
That’s it for today, Let us know if you are facing an issue while implementing using this code by commenting below.
Happy Croning!