- - PR -
webサービスの非同期メソッドの実装について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-25 10:57
皆様、ご回答ありがとう御座います。
返答が遅れてしまい申し訳御座いません。 WEBサービス側で非同期にしたい理由は、 クライアントから非同期で呼出した場合でも、 webサービス側で、SqlCommand.ExecuteNonQueryによる 処理に時間のかかるストアドを実行した場合、 SQLServer2000から結果が返ってくるまで、待ってしまう為です。 なちゃ様のおっしゃっている ・Webサービスの非同期実装 に該当すると思います。 知識が浅く、これをどう実装すればよいか、試行錯誤している状況です。 なにか良いアドバイスが御座いましたらよろしくお願い致します。 | ||||||||
|
投稿日時: 2007-05-25 17:33
諸農です。
WEBサービスメソッド内でストアドの実行を要求して、そのストアドの終了を待たずしてサービスメソッドを抜けてサービスを呼び出したクライアントに制御を戻す、単純にはストアド呼び出しでブロックさせたくないと言う意味でしょうか。 クライアント側にはストアドの結果やステータスは返さなくていいんですね? SqlCommandクラスにはBeginExecuteNonQuery()メソッドがありますけど、要件を満たすかどうかは判断しないといけないかも。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2007-05-25 17:45
jubei様
引用: -------------------------------------------------------------------------------- WEBサービスメソッド内でストアドの実行を要求して、そのストアドの終了を待たずしてサービスメソッドを抜けてサービスを呼び出したクライアントに制御を戻す、単純にはストアド呼び出しでブロックさせたくないと言う意味でしょうか。 クライアント側にはストアドの結果やステータスは返さなくていいんですね? SqlCommandクラスにはBeginExecuteNonQuery()メソッドがありますけど、要件を満たすかどうかは判断しないといけないかも。 -------------------------------------------------------------------------------- やりたい事はまさしくjubei様の通りなのですが、 VS2003 .NetFrameWork1.1 の為、BeginExecuteNonQuery()が存在しないので、 困っている次第です。 | ||||||||
|
投稿日時: 2007-05-25 19:53
Webサービスメソッド内で別スレッドを起動して、そのスレッド上で ExecuteNonQuery() すればよいです。
スレッドの作り方は Thread クラスを参照してください。 但し、ExecuteNonQuery() の結果をどうするかは仕様を揉む必要があるでしょう。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2007-05-28 09:06
囚人様
ご回答ありがとう御座います。 囚人様の回答を参考にし、 クライアントから非同期でWEBサービスメソッドを呼出す ↓ 呼出されたWEBサービスメソッド内で、ExecuteNonQuery() を行うThread を作成 ↓ ExecuteNonQuery()の結果を待たずに、応答をクライアントへ返す。 ↓ ExecuteNonQuery()の結果を記録するテーブルを作成し、記録 ↓ クライアントから定期的にその結果テーブルを参照し結果を得る。 以上のような流れを考えてみましたが、このような実装は間違えている、 または、危険だったりしますでしょうか? | ||||||||
|
投稿日時: 2007-05-28 09:42
↑で実装するなら、場合によっては非常に危ういことを認識しおいてください。 ASP.NET アプリケーションから起動したスレッドは、当然 IIS がホストするプロセス内で実行されます。 IIS のプロセスは様々な理由により、非同期に再起動されることがあります。 その場合、IIS のあずかり知らぬところで起動されたスレッドは、有無を言わせずに強制終了されます。 確実を期すなら、「処理」を実行する専用の Windows サービスを作成し、ASP.NET アプリケーションから Windows サービスに処理依頼を行うようなモデルを採用するべきと思います。 | ||||||||
|
投稿日時: 2007-05-28 10:48
ジョブを登録するってイメージですかね。だったら非同期にしたりする必要が無いような気がしないでもないですが・・・。 ------------------------- ジョブ管理テーブルと結果テーブルを用意。(場合によっては結果テーブルはジョブ管理テーブルに統合) クライアントから同期でWEBサービスメソッドを呼出す ↓ ジョブ管理テーブルを作ってそれに登録(ExecuteNonQueryでやろうとしていたSQLコマンドも) ↓ ジョブが正常に登録できたかどうかの応答をクライアントへ返す。 ↓ クライアントから定期的にジョブ管理テーブル,結果テーブルを参照し結果を得る。 データベース側で、データベースのジョブスケジュールでジョブ管理テーブルをポーリングして未処理のジョブを検出し処理を実行。 (データベースにジョブのスケジュール機能が無いならWindowsサービスにするしかない?) (キューを使えるデータベースなら、キューを使ってみるのもいいかも) ↓ ジョブ管理テーブルにステータスを、結果テーブルに結果を記録 ------------------------- いかがでしょうか。 | ||||||||
|
投稿日時: 2007-05-28 11:30
そうですね。 それがイチバン堅実だと思います。
クライアント側が同期呼び出しでなければならないことはないですね。 まぁ、GUI アプリで Web メソッド呼び出し時のブロックを回避したい、とかそういう意味で非同期呼び出しを選択することはあるかもしれません。 |