Allow to retry and delete failed jobs in System Status
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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
11
public/css/style.css
vendored
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
<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>
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user