Refactor the way we execute scheduled commands

This commit is contained in:
David Bomba 2022-11-26 14:38:09 +11:00
parent ea5b950a54
commit 5c60dab8c6
5 changed files with 114 additions and 84 deletions

View File

@ -54,13 +54,13 @@ class Kernel extends ConsoleKernel
$schedule->job(new ReminderJob)->hourly()->withoutOverlapping()->name('reminder-job')->onOneServer(); $schedule->job(new ReminderJob)->hourly()->withoutOverlapping()->name('reminder-job')->onOneServer();
/* Returns the number of jobs in the queue */ /* Returns the number of jobs in the queue */
$schedule->job(new QueueSize)->everyFiveMinutes()->withoutOverlapping(); $schedule->job(new QueueSize)->everyFiveMinutes()->withoutOverlapping()->name('queue-size-job')->onOneServer();
/* Checks for large companies and marked them as is_large */ /* Checks for large companies and marked them as is_large */
$schedule->job(new CompanySizeCheck)->dailyAt('23:20')->withoutOverlapping()->name('company-size-job')->onOneServer(); $schedule->job(new CompanySizeCheck)->dailyAt('23:20')->withoutOverlapping()->name('company-size-job')->onOneServer();
/* Pulls in the latest exchange rates */ /* Pulls in the latest exchange rates */
$schedule->job(new UpdateExchangeRates)->dailyAt('23:30')->withoutOverlapping(); $schedule->job(new UpdateExchangeRates)->dailyAt('23:30')->withoutOverlapping()->name('exchange-rate-job')->onOneServer();
/* Runs cleanup code for subscriptions */ /* Runs cleanup code for subscriptions */
$schedule->job(new SubscriptionCron)->dailyAt('00:01')->withoutOverlapping()->name('subscription-job')->onOneServer(); $schedule->job(new SubscriptionCron)->dailyAt('00:01')->withoutOverlapping()->name('subscription-job')->onOneServer();

View File

@ -46,19 +46,7 @@ class RecurringExpensesCron
nlog('Sending recurring expenses '.Carbon::now()->format('Y-m-d h:i:s')); nlog('Sending recurring expenses '.Carbon::now()->format('Y-m-d h:i:s'));
if (! config('ninja.db.multi_db_enabled')) { if (! config('ninja.db.multi_db_enabled')) {
$this->getRecurringExpenses();
} else {
//multiDB environment, need to
foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db);
$this->getRecurringExpenses();
}
}
}
private function getRecurringExpenses()
{
$recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString()) $recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString())
->whereNotNull('next_send_date') ->whereNotNull('next_send_date')
->whereNull('deleted_at') ->whereNull('deleted_at')
@ -79,6 +67,41 @@ class RecurringExpensesCron
$this->generateExpense($recurring_expense); $this->generateExpense($recurring_expense);
} }
}); });
} else {
//multiDB environment, need to
foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db);
$recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString())
->whereNotNull('next_send_date')
->whereNull('deleted_at')
->where('status_id', RecurringInvoice::STATUS_ACTIVE)
->where('remaining_cycles', '!=', '0')
->whereHas('company', function ($query) {
$query->where('is_disabled', 0);
})
->with('company')
->cursor();
nlog(now()->format('Y-m-d').' Generating Recurring Expenses. Count = '.$recurring_expenses->count());
$recurring_expenses->each(function ($recurring_expense, $key) {
nlog('Current date = '.now()->format('Y-m-d').' Recurring date = '.$recurring_expense->next_send_date);
if (! $recurring_expense->company->is_disabled) {
$this->generateExpense($recurring_expense);
}
});
}
}
}
private function getRecurringExpenses()
{
//extracting this back to the if/else block to test duplicate crons
} }
private function generateExpense(RecurringExpense $recurring_expense) private function generateExpense(RecurringExpense $recurring_expense)

View File

@ -44,22 +44,13 @@ class BankTransactionSync implements ShouldQueue
*/ */
public function handle() public function handle()
{ {
// if (! Ninja::isHosted()) {
// return;
// }
//multiDB environment, need to //multiDB environment, need to
foreach (MultiDB::$dbs as $db) { foreach (MultiDB::$dbs as $db)
{
MultiDB::setDB($db); MultiDB::setDB($db);
nlog("syncing transactions"); nlog("syncing transactions");
$this->syncTransactions();
}
}
public function syncTransactions()
{
$a = Account::with('bank_integrations')->whereNotNull('bank_integration_account_id')->cursor()->each(function ($account){ $a = Account::with('bank_integrations')->whereNotNull('bank_integration_account_id')->cursor()->each(function ($account){
// $queue = Ninja::isHosted() ? 'bank' : 'default'; // $queue = Ninja::isHosted() ? 'bank' : 'default';
@ -77,5 +68,6 @@ class BankTransactionSync implements ShouldQueue
}); });
} }
}
} }

View File

@ -42,21 +42,8 @@ class QuoteCheckExpired implements ShouldQueue
*/ */
public function handle() public function handle()
{ {
if (! config('ninja.db.multi_db_enabled')) if (! config('ninja.db.multi_db_enabled')){
return $this->checkForExpiredQuotes();
foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db);
$this->checkForExpiredQuotes();
}
}
private function checkForExpiredQuotes()
{
Quote::query() Quote::query()
->where('status_id', Quote::STATUS_SENT) ->where('status_id', Quote::STATUS_SENT)
->where('is_deleted', false) ->where('is_deleted', false)
@ -75,6 +62,41 @@ class QuoteCheckExpired implements ShouldQueue
->each(function ($quote){ ->each(function ($quote){
$this->queueExpiredQuoteNotification($quote); $this->queueExpiredQuoteNotification($quote);
}); });
}
else {
foreach (MultiDB::$dbs as $db)
{
MultiDB::setDB($db);
Quote::query()
->where('status_id', Quote::STATUS_SENT)
->where('is_deleted', false)
->whereNull('deleted_at')
->whereNotNull('due_date')
->whereHas('client', function ($query) {
$query->where('is_deleted', 0)
->where('deleted_at', null);
})
->whereHas('company', function ($query) {
$query->where('is_disabled', 0);
})
// ->where('due_date', '<='. now()->toDateTimeString())
->whereBetween('due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()])
->cursor()
->each(function ($quote){
$this->queueExpiredQuoteNotification($quote);
});
}
}
}
private function checkForExpiredQuotes()
{
} }
private function queueExpiredQuoteNotification(Quote $quote) private function queueExpiredQuoteNotification(Quote $quote)

View File

@ -44,25 +44,18 @@ class ReminderJob implements ShouldQueue
* *
* @return void * @return void
*/ */
public function handle() public function handle() :void
{ {
if (! config('ninja.db.multi_db_enabled')) { if (! config('ninja.db.multi_db_enabled')) {
$this->processReminders(); $this->processReminders();
} else { } else {
//multiDB environment, need to //multiDB environment, need to
/*
foreach (MultiDB::$dbs as $db) { foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db); MultiDB::setDB($db);
nlog("set db {$db}"); nlog("set db {$db}");
$this->processReminders(); $this->processReminders();
} }
*/
//24-11-2022 fix for potential memory leak during a long running process, the second reminder may run twice
foreach (config('ninja.dbs') as $db) {
MultiDB::setDB($db);
nlog("set db {$db}");
$this->processReminders();
}
} }
} }