アプリケーションでキューとして機能する SQL サーバー テーブルを使用しています。SQL 依存関係を使用したクエリ通知を使用しています。特に、このブログ投稿で使用されている Jeremiah Gowdy の素晴らしい実装です。http://jgowdy.blogspot.com/2010/01/sqldependency-query-notification-with.html
これを Windows サービスに実装し、それを使用して SQL テーブル、つまりキューの変更を「リッスン」し、変更がある場合はキューの返された内容を処理します - 以下のコードを参照して、内容のデータセットを返しますストアド プロシージャ。
問題は、負荷が高い場合や一定期間が過ぎた場合、テーブルにレコードが存在する場合でも、変更が検出されなくなることです。サービスを再起動すると、変更が検出されます! テーブルを手動で更新して通知をトリガーしようとしましたが、役に立ちませんでした。ある時点で通知サービスが中断され、再登録に失敗したようですが、確信が持てません。
テーブル自体の変更を常に監視し、キューがスタックした場合はサービスを再起動する必要があるため、この問題の解決策を必死に見つけようとしています-理想的ではありません!
他の誰かが SQL 依存関係とクエリ通知で問題を抱えていますか? 特に、既知の問題に関するガイダンスや知識が役立ちます。より良いキューイングシステムが存在することは知っていますが、プロジェクト全体を再開発するのではなく、できればこの問題を解決しようとしています!!!
コードスニペットを次に示します。
//Initialisation
public void StartWatcher()
{
SqlCommand cmd = new SqlCommand();
cmd = new SqlCommand("TransferExportQueue");
cmd.CommandType = System.Data.CommandType.StoredProcedure;
log.Info("Setting up SQL Watcher");
//Setup the SQLWatcher
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.ConnectionString = ConfigurationManager.ConnectionStrings["Connexion"].ConnectionString;
log.Info("Attempting to Start");
SqlQueueWatcher = new SqlWatcher(builder.ConnectionString, cmd, SqlWatcher.SqlWatcherNotificationType.Blocking);
SqlQueueWatcher.OnChange += new SqlWatcher.SqlWatcherEventHandler(QueueSQLWatcher_OnChange);
SqlQueueWatcher.Start();
}
//OnChangeEvent
private void QueueSQLWatcher_OnChange(DataSet Result)
{
//perform logic in returned contents of stored procedure
}
ここに私のストアドプロシージャがあります
Create PROCEDURE [dbo].[TransferExportQueue]
AS
BEGIN
SELECT [Id]
,[TransactionLogId]
,[QueueDate]
,[UpdateTable]
FROM [dbo].[TransferExportQueue]
END
更新: SQL サーバーのログがあり、次のエラーが発生しています。
The query notification dialog on conversation handle '{9586CB6A-62BA-E311-983B-A0369F0A65D3}.' closed due to the following error: '<?xml version="1.0"?><Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-8470</Code><Description>Remote service has been dropped.</Description></Error>'.
さらに掘り下げた後、リモートサービスがドロップし続けているようです.SQLDependencyが呼び出しのたびにサブスクリプションをクリーンアップする方法に関係しているようです. この問題を解決する方法を知っている人はいますか?