DisableConcurrentExecution(timeout:0)
(0回の再試行)を使用する分単位の繰り返しジョブがあります。これは、特にジョブの完了に1分以上かかる場合(状況によって異なります)、一度に1人のワーカーのみが処理する必要があるためです。
ダッシュボードで「スキップされた」ジョブにfailed
フラグを付けたくないので、 DisableConcurrentExecutionAttribute
とほぼ同じSkipConcurrentExecutionAttribute
を追加したいと思いました。ロックの取得を試行/キャッチし、 DistributedLockTimeoutException
を飲み込んで、ジョブをDeletedState
に設定する理由を説明します。
しかし、 GetResource()はプライベートであり、その実装はライブラリの内部にある他のメソッドを参照しているため、これを適切に行うことはできません。
$"{job.Type.ToGenericTypeString()}.{job.Method.Name}"
は、競合しない分散ロック名を作成するための安全な方法のようですが、参照することはできません。
ジョブの分散ロック名を生成するパブリックメソッドをlibに含めることはできますか?
cf.、 https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4
filterContext.BackgroundJob.Job.ToString()
が内部のTypeExtensions.csと同じ文字列を提供し、DisableConcurrentExecutionAttribute.cs(再)実装が...問題を解決することに気づきました。
@dgaspar 、次の定期的なジョブの作成をスキップするように定期的なジョブスケジューラに指示できます。前の定期的なジョブがまだ実行されている場合は、次の要点を参照してください: https :
@odinserjの提案をありがとう。 実行中にワーカーがクラッシュした場合、その「実行中」の行がハッシュテーブルに残ることに気づきました。 その行を手動で削除するまで、ジョブが再スケジュールされるのを防ぎますか? または、不足している有効期限/クリーンアップはありますか? (ところで、私はnew SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) }
、それが重要な場合)
バックグラウンドジョブの実行中にワーカーが終了すると、すべてのメッセージキューがトランザクションであるため、そのバックグラウンドジョブは自動的に再スケジュールされます(少なくとも公式のキューでは、他のストレージ実装も同じように動作する必要があります)。
最も参考になるコメント
@dgaspar 、次の定期的なジョブの作成をスキップするように定期的なジョブスケジューラに指示できます。前の定期的なジョブがまだ実行されている場合は、次の要点を参照してください: https :