2012-03-12 3 views
0

私は、継続的に計算タスクを実行する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の古いエントリを定期的にクリーンアップするために実行する別のタイマーを含めるべきです。思考?

+0

日付/時刻によるフィルタリングが機能しないのはなぜですか?あなたはあなたがその問題を詳しく説明できますか?単にクロックが同期していないのでしょうか?その場合、データと一緒にサービスからタイムスタンプを返すことができず、クライアントは次の呼び出しで再びタイムスタンプを渡すことができませんでした。 –

+0

クイック返信をありがとう。あなたは正しい。クロックが同期していないため、日付/時刻フィルタリングが機能しません。異なるタイムゾーンにあり、活動データが返されなかったケースがありました。 –

+0

サービスと一緒にサービスのタイムスタンプを返すことは確実に機能します。 –

答えて

1

最初の問題については、各応答でサーバーの時刻を返し、要求を行うときに、自分の時刻ではなくこのタイムスタンプを送信するようクライアントに依頼してください。

第2の問題点:計算/ステップが、更新のセットごとに固定サイズのバッファを用意するのではなく、異なるレートでメッセージを生成している場合、私は頻繁にクリーンアップジョブを実行し、 [クライアントのping間隔の小さい倍数]より古いメッセージ。

+0

ご協力ありがとうございます!それはまさに私が各問題に取り組むためにしたことです。 2番目の問題では、単純なTimerを実装しました。タイムスタンプが15秒以上経過していることを示すメッセージを削除しました。 –

0

2番目の問題として、古いエントリを自動的に上書きする循環配列構造を実装します。メッセージが書き込まれる割合が一定であれば、これは簡単であるはずです。可変であれば、5秒間に予想される最大メッセージ数に基づいて配列を作成するためのサイズを把握する必要があります。

+0

メッセージが書き込まれる速度は予測不可能であり、計算に使用されるデータに依存します。私は可能な限り辞書に入れておきたい。 –

+0

@JohnRussell:リストの辞書の代わりに円形配列の辞書を持つことはできますが、メッセージの変化率が非常に問題です。私は、最も古いエントリが上書きされる前に少なくとも5秒前であるかどうかをチェックするエキスパンダー・サーキュラー・リストを作成することを想像できます。リストを拡張するだけではない場合は、それが価値があるかもしれません。あなたは、定期的に発砲し、あなたが元来提案したようにあなたのリストをトリミングするタイマーかもしれません。 –

関連する問題