- PR -

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

投稿者投稿内容
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-05-28 11:58
渋木宏明(ひどり)様、
かめたろ様
ご回答ありがとう御座います。

当方、SQLSERVER2000に対する知識が、VS(VSも全くですが・・・)
に対する知識よりも更に浅く、
お二人のおっしゃる、ジョブ登録について理解できておりません。
(コードから行う方法など)
ジョブ登録について調べてみようと思います。

渋木宏明(ひどり)様のおっしゃる、

引用:

確実を期すなら、「処理」を実行する専用の Windows サービスを作成し、ASP.NET アプリケーションから Windows サービスに処理依頼を行うようなモデルを採用するべきと思います。



についてですが、

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

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

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

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

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

以上の部分のThreadがWindowsサービスに置き換わるイメージでしょうか?



皆様、親切に回答していただき、本当に助かります。
WEBサービス・IIS・SQLSERVEERに対する知識不足を痛切に感じております・・・
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-28 12:19
引用:

以上の部分のThreadがWindowsサービスに置き換わるイメージでしょうか?



そうです。

thread は必要な処理を実行し終わる前に制終了されてしまう可能性があるので、IIS とは別のプロセスで処理を実行する、というのが趣旨です。

個人的には、それを行うのには Windows サービスが妥当と考えたので「Windws サービス」を挙げました。

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-05-28 14:04
引用:

お二人のおっしゃる、ジョブ登録について理解できておりません。
(コードから行う方法など)
ジョブ登録について調べてみようと思います。


あ、誤解してるかもしれないです。
私が言っている「ジョブを登録」ってのは、ジョブ管理テーブル(自前のテーブルです)に"依頼を受付けた"って情報をINSERTするだけのことです。んで、後の事はデータベースの機能を使って、定期的に"依頼を受付けた"ってのをSELECTしてHITしたのを処理すればいいかなと考えました。
1レコードをINSERTするだけならそんなに時間はかからないだろうから、サーバ側を非同期にするまでもないのかなぁと。
その時間すら許容できないほどシビアなのであれば、このやり方は使えませんが。

「データベースのジョブスケジュール」ってのは、SQLSERVER2000のSQLServerエージェントのジョブに相当するモノのつもりで書きました。上のジョブとは全くの別物です。
分かりにくい書き方になっちゃってすみません。


引用:

クライアント側が同期呼び出しでなければならないことはないですね。


あー・・・。確かにそうですね。クライアント側・サーバ側がごっちゃになっちゃってました。ごめんなさい。


引用:

thread は必要な処理を実行し終わる前に制終了されてしまう可能性があるので、IIS とは別のプロセスで処理を実行する、というのが趣旨です。


別threadで時間の掛かる処理をしてる箇所があるのを思い出しました・・・。やべぇ・・・。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-05-28 22:09
引用:

渋木宏明(ひどり)さんの書き込み (2007-05-28 09:42) より:
引用:

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



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

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

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

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

確実を期すなら、「処理」を実行する専用の Windows サービスを作成し、ASP.NET アプリケーションから Windows サービスに処理依頼を行うようなモデルを採用す

るべきと思います。



ご指摘ありがとうございます。

どうやら以下にも、ASP.NET でマニュアルでのスレッド作成は避けるべきとありました。
http://msdn2.microsoft.com/en-us/library/ms998549.aspx
「Threading Explained」「Threading Guidelines」の項。
周辺を拾い読みしたところ、代わりに Thread Pool を使用すればよいとあるようです。これがプロセスの再起動に対処できるのかどうかは分かりませんが。

_________________
囚人のジレンマな日々
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-05-28 22:50
現在ストアドのパラメータ(sqlcommand)
としてWEBサービスメソッドにパラメータを持たせていますが、
Windowsサービスでは整数値以外のパラメータを受け取る事ができない
ようですので(間違えた認識かも・・・)、
Windowsサービス内でExecuteNonQuery() を行うように実装
する場合、パラメータをどのように渡すかを考えなければいけないようですね。
またひとつ悩みどころが・・・

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