2017-09-15 10 views
0

ASP.Net Core 1.1のWebアプリケーションでcronタスクを実装しようとしています。ASP.Net CoreのHangfire:単純な定期ジョブが動的コンテンツをリフレッシュしない

Hangfireライブラリを選択することにしました。

私のインストールと構成が正常に動作しているかどうかを確認するために、私はコンソール出力に現在のDateTimeを印刷することを目的とした、非常に単純な繰り返し作業を書いた:

RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely); 

奇妙なことは、すべてのことですがメッセージが印刷された最初の日時に対応すると同じメッセージを出力し、DateTime.Now部分を更新しません。

私は/ Hangfireダッシュボードにアクセスし、ジョブの詳細を見れば、のような、静的日時出力として翻訳され表示されます。

Console.WriteLine("15/09/2017 15:27:21"); 

ので、ジョブがキューに入れたときに一種の「コンパイル」しているようですこれは明らかに私が意図したものではありません。

このジョブを、データベーステーブルの行数をカウントするジョブで置き換えようとしました。問題は同じです。ジョブの2回の間に行を追加または削除すると、表示される行数は更新されません。更新は、Webアプリケーションを再起動した場合にのみ発生します。

答えて

1

あなたの問題は、NewtonSoftを使用してジョブに送信する引数をHangfireがシリアル化することです。プログラムがジョブをエンキューすると、現在の時刻が取得され、その時刻にその関数が呼び出されます。

関数をメソッド呼び出しに移動してみてください。だからではなく、

RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely); 

のHangfireの私の理解が正しければ、これが唯一の時間をシリアル化するために呼び出すメソッドの名前をシリアル化しませんが、

RecurringJob.AddOrUpdate(() => PrintTime(), Cron.Minutely); 
... 
private static void PrintTime() { 
    Console.WriteLine($"{DateTime.Now}"); 
} 

を試してみてください。

+0

実際、あなたの答えはおそらく別の理由で同じ出力を提供しますが、私はその理由を理解し解決しました(回答を投稿します)。静的クラスの静的メソッドが私の問題でした。一度私のメソッドを各実行時にインスタンス化されたクラスに移動すると、すべてうまくいった。この特定のケースでは、あなたはその問題を特定したと思います。 – kall2sollies

+1

@ kall2sollies [迅速なテスト](https://shifty.site/JiBYF)のとおりに動作することが確認できます。 私がやっているアプリケーションにはいくつかのレイヤーがありますが、すべてのハングファイアプロセスはパブリック静的クラスのパブリックメソッドを介して開始されます。重要なテイクアウェイは、Enqueue/AddOrUpdateメソッドでhangfireに提供される情報が、メソッドに送信されるもののスナップショットであることです。これらのメソッド内で何が起き、そのメソッド内で何が生成されるのかは、そのメソッドが実行されたときに決定されます。 –

+0

私の最初の試みは落とし穴かもしれないと思います。私の静的クラスは、ASP.NetプロジェクトのStartupクラスのConfigureメソッドの拡張メソッドを保持するためのもので、ジョブの登録はこの拡張メソッドであり、呼び出されたメソッドは同じ静的クラスの別の静的メソッドでした。とにかく、最も重要なことは、適切に実装されたときに、それがすべて機能することです!努力をいただきありがとうございます! – kall2sollies

0

HangFireがJSONでパラメータをシリアル化するため、最初のdatetimeがシリアル化されたときに凍結され、後続の各実行で同じ出力が提供されるため、Stephen Vernyiが問題を発見しました。

しかし、彼が提案したように、メソッドを書くときは注意が必要です。

私は気を付けてこの作業をすべて行っていたので、静的メソッドを使用して静的クラス内で記述されたすべてのテストを行いました。そしてそのような実装は、同じ凍結datetimeの問題を提供しました!

デフォルトのASP.Net Core IoCコンテナに登録されているジョブサービスを使用して実装をリファクタリングし、すべてのリクエストで新しいサービスインスタンスを提供するように設定したとき、凍結された出力の問題を解決するだけでなく、すべての問題は依存性注入で遭遇しました。

関連する問題