私は非常に興味深い問題に直面しています。Delay job gem を 4 回テストしました。gem の設計上の問題かバグではないかと思います。コマンドrake jobs:work
を使用してワーカーを作成し、遅延ジョブを実行します。
LongTask レコードを作成したら、属性minutes_delayed
を 2 に変更する遅延ジョブも作成します。
属性を更新しないと、宝石は完全に機能します。しかし、説明を編集すると、gem は正しく動作しなくなります。つまり、遅延ジョブは実行されませんが、関連する遅延ジョブ レコードはデータベースから削除されます。
興味深い最終結果:
まったく同じ属性を持つオブジェクトを参照しているようです。この写真は実行時間が経過する前にキャプチャされました。
これは、すべてのテストが終了した後にキャプチャされたものです。test4 の遅延ジョブ レコードが削除されたことがわかりますが、この遅延ジョブは何の効果もありませんでした。
最終結果 (2 つのジョブのみが実行されます)
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] Starting job worker
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0343
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 16.6270 j/s, 0 failed ...
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0105
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 51.4774 j/s, 0 failed ...
モデル内のコード:
def set_delay_time(time)
self.minutes_delayed = time
# very important for this, otherwise cannot write the change into the database
self.save
end
handle_asynchronously :set_delay_time, :run_at => Proc.new { 2.minutes.from_now }
コントローラーのコード:
def create
@long_task = LongTask.new(params[:long_task])
respond_to do |format|
if @long_task.save
@long_task.set_delay_time(2)