Allow to retry and delete failed jobs in System Status

This commit is contained in:
FreeScout
2018-12-09 06:13:00 -08:00
parent 793aaac2e1
commit 9d79f4aea4
5 changed files with 97 additions and 43 deletions

View File

@@ -29,7 +29,7 @@ class Kernel extends ConsoleKernel
{
// Remove failed jobs
$schedule->command('queue:flush')
->daily();
->weekly();
// Restart processing queued jobs (just in case)
$schedule->command('queue:restart')

View File

@@ -70,6 +70,7 @@ class SystemController extends Controller
// Jobs
$queued_jobs = \App\Job::orderBy('created_at', 'desc')->get();
$failed_jobs = \App\FailedJob::orderBy('failed_at', 'desc')->get();
$failed_queues = $failed_jobs->pluck('queue')->unique();
// Commands
$commands_list = ['freescout:fetch-emails', 'queue:work'];
@@ -172,6 +173,7 @@ class SystemController extends Controller
'commands' => $commands,
'queued_jobs' => $queued_jobs,
'failed_jobs' => $failed_jobs,
'failed_queues' => $failed_queues,
'php_extensions' => $php_extensions,
'permissions' => $permissions,
'new_version_available' => $new_version_available,
@@ -180,6 +182,26 @@ class SystemController extends Controller
]);
}
public function action(Request $request)
{
switch ($request->action) {
case 'delete_failed_jobs':
\App\FailedJob::where('queue', $request->failed_queue)->delete();
\Session::flash('flash_success_floating', __('Failed jobs deleted'));
break;
case 'retry_failed_jobs':
$jobs = \App\FailedJob::where('queue', $request->failed_queue)->get();
foreach ($jobs as $job) {
\Artisan::call('queue:retry', ['id' => $job->id]);
}
\Session::flash('flash_success_floating', __('Failed jobs restarted'));
break;
}
return redirect()->route('system');
}
/**
* System tools.
*/

11
public/css/style.css vendored
View File

@@ -1458,6 +1458,13 @@ button.conv-checkbox-clear {
background-color: transparent!important;
font-weight: normal;
}
.conv-counter {
border: 1px solid #d6dde3;
background: #f8f9f9;
top: -1px;
font-size: 10px;
padding: 0 3px;
}
/*.conv-subject-number {
display: inline;
}*/
@@ -3438,6 +3445,10 @@ a.disabled:focus {
line-height: 1.42857143;
cursor: default;
}
.jobs-list {
max-height: 300px;
overflow-y: scroll;
}
/**
* Only main content is visible

View File

@@ -153,31 +153,33 @@
<p>
{{ __('Total') }}: <strong>{{ count($queued_jobs)}}</strong>
</p>
@foreach ($queued_jobs as $job)
<table class="table">
<tbody>
<tr>
<th colspan="2">{{ $loop->index+1 }}. {{ json_decode($job->payload, true)['displayName'] }}</th>
</tr>
<tr>
<td>{{ __('Queue') }}</td>
<td>{{ $job->queue }}</td>
</tr>
<tr>
<td>{{ __('Attempts') }}</td>
<td>
@if ($job->attempts > 0)<strong class="text-danger">@endif
{{ $job->attempts }}
@if ($job->attempts > 0)</strong>@endif
</td>
</tr>
<tr>
<td>{{ __('Created At') }}</td>
<td>{{ App\User::dateFormat($job->created_at) }}</td>
</tr>
</tbody>
</table>
@endforeach
<div class="jobs-list">
@foreach ($queued_jobs as $job)
<table class="table">
<tbody>
<tr>
<th colspan="2">{{ $loop->index+1 }}. {{ json_decode($job->payload, true)['displayName'] }}</th>
</tr>
<tr>
<td>{{ __('Queue') }}</td>
<td>{{ $job->queue }}</td>
</tr>
<tr>
<td>{{ __('Attempts') }}</td>
<td>
@if ($job->attempts > 0)<strong class="text-danger">@endif
{{ $job->attempts }}
@if ($job->attempts > 0)</strong>@endif
</td>
</tr>
<tr>
<td>{{ __('Created At') }}</td>
<td>{{ App\User::dateFormat($job->created_at) }}</td>
</tr>
</tbody>
</table>
@endforeach
</div>
</td>
</tr>
<tr>
@@ -185,24 +187,42 @@
<td>
<p>
{{ __('Total') }}: <strong @if (count($failed_jobs) > 0) class="text-danger" @endif >{{ count($failed_jobs) }}</strong>
@if (count($failed_jobs))
&nbsp;&nbsp;
<form action="{{ route('system.action') }}" method="POST">
{{ csrf_field() }}
<select name="failed_queue" class="">
@foreach ($failed_queues as $queue)
<option value="{{ $queue }}">{{ $queue }}</option>
@endforeach
</select>
<button type="submit" name="action" value="delete_failed_jobs" class="btn btn-default btn-xs margin-left-10">{{ __('Delete') }}</button>
<button type="submit" name="action" value="retry_failed_jobs" class="btn btn-default btn-xs">{{ __('Retry') }}</button>
</form>
@endif
</p>
@foreach ($failed_jobs as $job)
<table class="table">
<tbody>
<tr>
<th colspan="2">{{ $loop->index+1 }}. {{ json_decode($job->payload, true)['displayName'] }}</th>
</tr>
<tr>
<td>{{ __('Queue') }}</td>
<td>{{ $job->queue }}</td>
</tr>
<tr>
<td>{{ __('Failed At') }}</td>
<td>{{ App\User::dateFormat($job->failed_at, 'M j, Y H:i:s') }}</td>
</tr>
</tbody>
</table>
@endforeach
<div class="jobs-list">
@foreach ($failed_jobs as $job)
<table class="table">
<tbody>
<tr>
<th colspan="2">{{ $loop->index+1 }}. {{ json_decode($job->payload, true)['displayName'] }}</th>
</tr>
<tr>
<td>{{ __('Queue') }}</td>
<td>{{ $job->queue }}</td>
</tr>
<tr>
<td>{{ __('Failed At') }}</td>
<td>{{ App\User::dateFormat($job->failed_at, 'M j, Y H:i:s') }}</td>
</tr>
</tbody>
</table>
@endforeach
</div>
</td>
</tr>
</tbody>

View File

@@ -97,6 +97,7 @@ Route::get('/system/status', ['uses' => 'SystemController@status', 'middleware'
Route::get('/system/tools', ['uses' => 'SystemController@tools', 'middleware' => ['auth', 'roles'], 'roles' => ['admin']])->name('system.tools');
Route::post('/system/tools', ['uses' => 'SystemController@toolsExecute', 'middleware' => ['auth', 'roles'], 'roles' => ['admin']]);
Route::post('/system/ajax', ['uses' => 'SystemController@ajax', 'laroute' => true, 'middleware' => ['auth', 'roles'], 'roles' => ['admin']])->name('system.ajax');
Route::post('/system/action', ['uses' => 'SystemController@action', 'middleware' => ['auth', 'roles'], 'roles' => ['admin']])->name('system.action');
// Open tracking
Route::get('/thread/read/{conversation_id}/{thread_id}', 'PublicController@setThreadAsRead')->name('open_tracking.set_read');