2011-08-11 19 views
2

私のチームは、とりわけインポート機能を含むASP.NETアプリケーションを開発しています。インポートは、通常、ユーザがインポートするローカルファイルを含むウェブページにいくつかの設定を入力することによって開始される。ユーザーが「インポート」を押すと、ファイルをアップロードしてからインポートする必要があります。ASP.NETアプリケーションのバックグラウンドジョブ

インポートはかなり時間がかかるので、aspx.csコードから直接行うことはできません。バックグラウンドで行う必要があります。また、一旦ファイルがアップロードされると、インポートは失われません。私はまた、を開始するインポートをしたいと思います。サービスやスケジュールされたタスクを待つ必要はなく、X分ごとに利用可能な仕事をチェックするだけです。

私がこれまでに代替案として発見したことはある:ASP.NETでのThreadPoolまたは類似から

  • バックグラウンドスレッド。主に動作しますが、アプリケーションプールをリサイクルすると作業が失われます。
  • 定期的にDB内の作業表をチェックし、インポートを実行するタイマーによるサービス。動作しますが、遅延があるか、DBからの作業要求が頻繁に発生します。
  • 変更通知クエリによるサービス(正確な名前はわかりませんが、SQLサーバーからの変更をサブスクライブすることは可能です)。
  • サービスがMSMQを介して作業項目を取得しています。
  • リサイクルを避けるため、システムサービス内でホストされ、ASP.NET内ではホストされないWCFサービス。 WCFサービスはASP.NETから内部的に呼び出されるか、AJAXを介してクライアントから直接公開され呼び出されます(非IISホストWCFがAJAXエンドポイントを公開できる場合)。

他の方法はありますか?上記の選択肢の経験がある人はいますか?

答えて

2

アップロードサービスのディレクトリに変更がないかどうか監視します(FileSystemWatcherなど)。

このようにして、サービスが開始され、サービスから何らかのポーリングを受ける必要がない限り、最小限の遅延しかありません。

(ユーザーが入力した)設定は、DBに格納して(サービスからクエリを実行する)、ファイルに書き込むこともできます。

0

あなたが言及したように、さまざまなアプローチや選択肢があります。

私たちは、エージェント(ジョブマネージャ)として機能するWindowsサービスをうまく使用し、新しいワーカーが追加されたときにエージェントに全く触れることなく小さなASPXページでプラグインされて構成された種類のワーカーを作成しました。

このように、エージェントは常にWindowsサービスとして実行され、ワー​​カーの種類とその設定に応じて、ワーカーのexecuteメソッドが呼び出され、ジョブが実行されます。

MSMQで述べたように、はるかに単純なデザインを使用することもできます。

0

これは、私たちがやっていた要求に応じてレポートをメールで送信するのと同じです。

  1. ユーザーは、キューテーブルにレコードを追加するWebアプリケーションを通じてレポートを要求します。
  2. Windowsサービスはキューテーブルを監視し、レポートを生成します(レポートタイプに応じて数秒から1時間以上かかることがあります)。
  3. 別のWindowsサービスでは、レポートが準備されたら電子メールで通知します。

#2と#3の両方は定期的にDBをチェックし(キューに入れられたアイテムの関連する「ステータス」)、キューに入れられているが処理されていないすべてのアイテムをバッチとして処理します。

0

実際の作業を行うCLRストアドプロシージャを呼び出すDBトリガ?

私はMSMQの経験がありますが、あまりにも多くのデータをMSMQにオーバーロードしないでください。投稿import-id:MSMQに類似していて、実際のペイロードをデータベーステーブルに格納します。 MSMQはかなりのデータを処理できますが、ほとんどの管理ツールは起動時にキュー内のすべてのメッセージ(ペイロードを含む)を覗き込む傾向があり、非常に遅くなります。

関連する問題