- PR -

webサービスの非同期メソッドの実装について

投稿者投稿内容
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-05-25 10:57
皆様、ご回答ありがとう御座います。
返答が遅れてしまい申し訳御座いません。

WEBサービス側で非同期にしたい理由は、
クライアントから非同期で呼出した場合でも、
webサービス側で、SqlCommand.ExecuteNonQueryによる
処理に時間のかかるストアドを実行した場合、
SQLServer2000から結果が返ってくるまで、待ってしまう為です。

なちゃ様のおっしゃっている
・Webサービスの非同期実装
に該当すると思います。

知識が浅く、これをどう実装すればよいか、試行錯誤している状況です。
なにか良いアドバイスが御座いましたらよろしくお願い致します。

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2007-05-25 17:33
諸農です。

引用:

webサービス側で、SqlCommand.ExecuteNonQueryによる
処理に時間のかかるストアドを実行した場合、
SQLServer2000から結果が返ってくるまで、待ってしまう為です。



WEBサービスメソッド内でストアドの実行を要求して、そのストアドの終了を待たずしてサービスメソッドを抜けてサービスを呼び出したクライアントに制御を戻す、単純にはストアド呼び出しでブロックさせたくないと言う意味でしょうか。
クライアント側にはストアドの結果やステータスは返さなくていいんですね?
SqlCommandクラスにはBeginExecuteNonQuery()メソッドがありますけど、要件を満たすかどうかは判断しないといけないかも。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-05-25 17:45
jubei様

引用:
--------------------------------------------------------------------------------
WEBサービスメソッド内でストアドの実行を要求して、そのストアドの終了を待たずしてサービスメソッドを抜けてサービスを呼び出したクライアントに制御を戻す、単純にはストアド呼び出しでブロックさせたくないと言う意味でしょうか。
クライアント側にはストアドの結果やステータスは返さなくていいんですね?
SqlCommandクラスにはBeginExecuteNonQuery()メソッドがありますけど、要件を満たすかどうかは判断しないといけないかも。
--------------------------------------------------------------------------------

やりたい事はまさしくjubei様の通りなのですが、
VS2003 .NetFrameWork1.1 の為、BeginExecuteNonQuery()が存在しないので、
困っている次第です。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-05-25 19:53
Webサービスメソッド内で別スレッドを起動して、そのスレッド上で ExecuteNonQuery() すればよいです。
スレッドの作り方は Thread クラスを参照してください。

但し、ExecuteNonQuery() の結果をどうするかは仕様を揉む必要があるでしょう。
_________________
囚人のジレンマな日々
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-05-28 09:06
囚人様
ご回答ありがとう御座います。

囚人様の回答を参考にし、

クライアントから非同期でWEBサービスメソッドを呼出す

呼出されたWEBサービスメソッド内で、ExecuteNonQuery() を行うThread を作成

ExecuteNonQuery()の結果を待たずに、応答をクライアントへ返す。

ExecuteNonQuery()の結果を記録するテーブルを作成し、記録

クライアントから定期的にその結果テーブルを参照し結果を得る。

以上のような流れを考えてみましたが、このような実装は間違えている、
または、危険だったりしますでしょうか?


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-28 09:42
引用:

Webサービスメソッド内で別スレッドを起動して、そのスレッド上で ExecuteNonQuery() すればよいです。



↑で実装するなら、場合によっては非常に危ういことを認識しおいてください。

ASP.NET アプリケーションから起動したスレッドは、当然 IIS がホストするプロセス内で実行されます。

IIS のプロセスは様々な理由により、非同期に再起動されることがあります。

その場合、IIS のあずかり知らぬところで起動されたスレッドは、有無を言わせずに強制終了されます。

確実を期すなら、「処理」を実行する専用の Windows サービスを作成し、ASP.NET アプリケーションから Windows サービスに処理依頼を行うようなモデルを採用するべきと思います。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-05-28 10:48
引用:

そら豆さんの書き込み (2007-05-28 09:06) より:
クライアントから非同期でWEBサービスメソッドを呼出す

呼出されたWEBサービスメソッド内で、ExecuteNonQuery() を行うThread を作成

ExecuteNonQuery()の結果を待たずに、応答をクライアントへ返す。

ExecuteNonQuery()の結果を記録するテーブルを作成し、記録

クライアントから定期的にその結果テーブルを参照し結果を得る。


ジョブを登録するってイメージですかね。だったら非同期にしたりする必要が無いような気がしないでもないですが・・・。

-------------------------
ジョブ管理テーブルと結果テーブルを用意。(場合によっては結果テーブルはジョブ管理テーブルに統合)

クライアントから同期でWEBサービスメソッドを呼出す

ジョブ管理テーブルを作ってそれに登録(ExecuteNonQueryでやろうとしていたSQLコマンドも)

ジョブが正常に登録できたかどうかの応答をクライアントへ返す。

クライアントから定期的にジョブ管理テーブル,結果テーブルを参照し結果を得る。

データベース側で、データベースのジョブスケジュールでジョブ管理テーブルをポーリングして未処理のジョブを検出し処理を実行。
(データベースにジョブのスケジュール機能が無いならWindowsサービスにするしかない?)
(キューを使えるデータベースなら、キューを使ってみるのもいいかも)

ジョブ管理テーブルにステータスを、結果テーブルに結果を記録
-------------------------

いかがでしょうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-28 11:30
引用:

ジョブを登録するってイメージですかね。



そうですね。
それがイチバン堅実だと思います。

引用:

だったら非同期にしたりする必要が無いような気がしないでもないですが・・・。



クライアント側が同期呼び出しでなければならないことはないですね。
まぁ、GUI アプリで Web メソッド呼び出し時のブロックを回避したい、とかそういう意味で非同期呼び出しを選択することはあるかもしれません。

スキルアップ/キャリアアップ(JOB@IT)