2011-12-20 17 views
1

レポートを生成する方法を実行するWindowsサービスがあるとします。例えばレポートのキューイング方法の改善

は、私がレポートのレポートパス、ステータス、名前を持つレポートのテーブルを持っていると言う、パラメータなど

ユーザーが新しいエントリを持つテーブルに追加されます生成するレポート]ボタンをクリックする

キューに入れられた状態。このサービスは、キューに入れられたレポートを取得し、レポートを生成し、ステータスを更新し、完了したレポートのパスを設定します。

TimerCallback callback = new TimerCallback(RunQuery); 
this.QueryTimer = new Timer(callback, null, 1000, 10000); 

public void RunQuery(object obj) 
{       
    //find reports with status of queued, 
    //loop through them and generate reports    
} 

それともReportIdでファイルを作成してに報告するかを決定するためにFileSystemWatcherを使用します。

私はこれをやって考えることができます2つの方法がキューイングされたレポート(のようなもの)のためにテーブルをポーリングのいずれかにあります(のようなもの)を実行します。

private void FileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) 
{ 
    ReportStack.Push(e.FullPath); 
    Thread TR = new Thread(RunQuery); 
    TR.Start(); 
} 

public void RunQuery() 
{       
    string filePath = Convert.ToString(ReportStack.Pop()); 
    GenerateReport(filePath); 
    ... 
} 

第一の方法の欠点は、私がポーリング時間を指定する必要があり、それらがキューに入れられるようレポートが瞬時に生成しないということです。 2番目の方法の欠点は、ファイルの作成と削除、共有フォルダーへの書き込みの許可の設定などの小さな手間です。

サービスを自動的に開始する方法はありますかレポートテーブル(DatabaseTableWatcherのようなもの)に置くか、これを行うもう1つのよりよい方法ですか?

+1

SQL Server通知サービスはありますか? http://www.codeproject.com/KB/dotnet/sqlns.aspx – Pleun

+0

@PleunこれはCEPでsuperseededされていない(私はについて何も知りませんか!)?そのCodeProjectのページには、2002年からhttp://blogs.msdn.com/b/hovsep/archive/2009/08/23/notification-services-has-died-welcome-sql-server-2008-r2-complex-event-ですprocessing-cep-technology.aspx – woggles

答えて

1

SQLトリガまたはメッセージキュー記録はあなたがそのようなSPROCを呼び出してアクションをオフに解雇することができ、テーブルに挿入されているので、

http://msdn.microsoft.com/en-us/library/ms189799.aspx

個人的に私はあなたの最初のポーリング手法が好きです。

+0

トリガーの問題は、ストアドプロシージャだけでなく、.NETコードを実行するために必要なことです。これを行うことは可能ですか?私はおそらくポーリングのアプローチを使用して終わるでしょうが、私の唯一の懸念は、ユーザーのための遅延です(つまり、レポートが生成されるのを20秒待ってから)。私はポーリング時間を増やすことができますが、x秒ごとにデータベースヒットの影響をテストする必要があります。 – woggles

1

Microsoft Message Queuing (MSMQ)はどうですか? MSMQは、オペレーティングシステムレベルでメッセージキューを作成および管理します。それはあなたのアプリケーションに完璧にマッチしたようです。