私は、継続的に計算タスクを実行するWindowsサービスを持っています。 1つの計算タスクの一部として実行される複数の計算ステップがあります。アクティビティのポーリングサービス
このサービスは、複数のクライアントがポーリングしてその動作を観察できるように、計算タスクと手順を記録/追跡するために必要です。
この要件を満たすために、アクティビティメッセージを収集するサービスに簡単なDictionary<Guid, List<string>>
(_activity
)を追加しました。キーはCalculationTask.Id
を表すGuid
であり、値は個々の計算ステップからのメッセージを保持するList<string>
です。
私は、(wcfを介して)クライアントから呼び出されたサービスに、動作メッセージをポーリングするためのメソッドを単純に追加しました。
:クライアントは、ここで
private readonly Dictionary<Guid, List<string>> _activity = new Dictionary<Guid, List<string>>();
public List<string> GetActivity(DateTime lastPolledTimeStamp)
{
var snapshot = _activity.ToList();
return snapshot.SelectMany(x => x.Value)
.Where(x => x.TimeStamp > lastPolledTimeStamp)
.OrderBy(x => x.TimeStamp)
.ToList();
}
は私の問題と質問されている...「私は最後のをポーリングするので、私にあなたのメッセージのすべてを与える」、サービスを伝えるための試みでlastPolledTimeStamp
に渡します(1)クライアントとサービスが異なるマシン上にある場合、日時比較による結果のフィルタリングは機能しません。そして、私はGetActivity
が呼び出されるたびに、すべてを_activity
に返すことはできません。あまりにも多くのデータがあります。何らかのフィルタリングが必要です。その他の選択肢は何ですか?
(2)別の「問題」は、_activity
辞書のキーと値のペアをいつ削除できるかを知っていることです。クライアントは5秒ごとにポーリングしています。私はクライアントがそれを拾うチャンスを持っているように、キー/値のペアを十分に長くしておきたいと思います。おそらく、_activity
の古いエントリを定期的にクリーンアップするために実行する別のタイマーを含めるべきです。思考?
日付/時刻によるフィルタリングが機能しないのはなぜですか?あなたはあなたがその問題を詳しく説明できますか?単にクロックが同期していないのでしょうか?その場合、データと一緒にサービスからタイムスタンプを返すことができず、クライアントは次の呼び出しで再びタイムスタンプを渡すことができませんでした。 –
クイック返信をありがとう。あなたは正しい。クロックが同期していないため、日付/時刻フィルタリングが機能しません。異なるタイムゾーンにあり、活動データが返されなかったケースがありました。 –
サービスと一緒にサービスのタイムスタンプを返すことは確実に機能します。 –