いいえ、キューに入れられた/処理されたジョブの履歴を保持したいと思っています。
データベースフィールドをカスタマイズするための組み込みサポートはありません。
参照:
https://github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff/src/Illuminate/Queue/DatabaseQueue.php#L170
この動作が意図されて私の理解から、あなたは元のジョブ 'テーブルには本当に台無しではないはずだから。ステートレスに動作するように設計されています。つまり、ジョブレコードは処理された直後に削除されます。
あなたの仕事(履歴など)を把握したい場合は、新しいEloquentモデルを作成してジョブコンストラクタに渡すだけです。元のジョブと履歴を同期させておくために、これは便利です。
いいえ、コーディングを開始しますか?
PHPの職人メイクを:
を入力して新しい移行を作成し、移行create_jobs_history_table
は今、その移行を開き、次の列タイプを追加します。
データベース/移行/xyz_create_jobs_history_table:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateJobsHistoryTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('jobs_history', function(Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('user_id');
$table->string('job', 40);
$table->integer('status')->default(0);
$table->timestamps();
if (Schema::hasColumn('users', 'id'))
{
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
}
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('jobs_history');
Schema::enableForeignKeyConstraints();
}
}
説明:
あなたが見ることができるように、我々は のuser_id、仕事と呼ばれる3つの新しいタイプを追加しましたおよびステータス。
user_idは、ユーザーの実際のIDを参照します。
ジョブフィールドは、ジョブの説明/名前です。
ステータスフィールドはステータスを表します。 0 =まだ
を完了= 1、proccessedない今、私たちの移行の準備ができたことを、私たちはそれのための新しいモデルを定義してみましょう:JobHistory.php
アプリ/
<?php namespace App; use Illuminate\Database\Eloquent\Model; class JobHistory extends Model { protected $table = 'jobs_history'; protected $hidden = []; }
甘い。今私たちのアプリケーションで私たちの仕事の歴史と簡単に交流することができます。
ジョブを作成するときです。以下のコードを使用して、そうしてみましょう:
アプリ/ジョブ/ProvisionUser.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\User;
use App\JobHistory;
class ProvisonUser implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
protected $history;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user, JobHistory $history)
{
$this->user = $user;
$this->history = $history;
// Set up our new history record.
$this->history->user_id = $this->user->id;
$this->history->job = 'Provison User';
$this->history->status = 0;
$this->history->save();
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Do other stuff here....
// Once the job has finished, set history status to 1.
$this->history->status = 1;
$this->history->save();
}
}
説明:
ここでは、ユーザーとJobHistoryモデルが含まれています。 コンストラクタでは、両方のモデルが必要で、新しい 履歴レコードを設定します。
実際のジョブは、新しい履歴レコードと同期されました。
良い。
ジョブが処理されている間に、handle()
関数が呼び出されます。 ここでは、終了後にステータスを1に設定します。
そして最後には、単にあなたのコントローラ内のジョブをディスパッチ:
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\User;
use App\JobHistory;
use App\Jobs\ProvisionUser;
class SomeController extends Controller
{
public function provision()
{
$user = User::find(1);
$job = (new ProvisionUser($user, new JobHistory))
->delay(Carbon::now()->addMinutes(1));
dispatch($job);
return view('provision');
}
}
は説明:
我々はコンストラクタに既存のユーザーと新規ジョブ履歴を渡します。 の後、私たちは遅延した仕事を派遣します。
注:遅延はデモ用です。
データベースを開き、jobs_historyテーブルを確認します。作業が発送されると、対応する履歴レコードのステータスは0になります。職人待ち行列作業員がジョブを処理したら、履歴レコードステータスは1になります。
この設定は、Laravel 5.4とI私のアプリケーションで同じロジックを使用してください。
ハッピーコーディング!
ステータス2で失敗したジョブを入れたいのですが、どうすれば対処できますか? – cartbeforehorse
私自身の質問に答えて、 'try {}'ブロックの 'handle()'関数にコード全体をラップし、例外をキャッチし、履歴のステータスを2に設定すると思います。あなたはそれをどうやってやるの? – cartbeforehorse
@cartbeforehorseそれは私がそれをする方法です。 – Steven