こんばんは。度々古いVerの話で申し訳ないのですが
COM.CURL.WSDK1.0 を使用した非同期通信
キャンセルの実装について
SOAP通信のRead時に
SOAPHTTPRPCPostCaller の
async-call メソッドを使用し
ResponseをRead中
待ちうけイベントの
SOAPHTTPRPCPostAsyncWorker
cancel メソッドを使用すると
SOAPHTTPRPCPostCaller
IOException[HTTPAsyncWinInetBufferedByteInputStream @0x0D1AAC04]がオープンされていません。
が発生する事象が起きております。
Response が返却される前の キャンセルは Post→Close で正常キャンセルが可能です。
当方でもオープンソースを、追ってはいるのですが、
このエラーを回避または、ハンドリングしたいと思っておりますが
該当箇所がどの辺りになるのか、ご教授願えませんでしょうか。
onyoさん
WSDKには詳しくないので参考になるかどうかわかりませんし、想像での回答ですが、
このエラー内容からは、非同期処理が開始して、AsyncWorker (ここではそのサブクラスのSOAPHTTPRPCPostAsyncWorker)が生成されているようですが、
取得すべきInputStreamは、まだオープンされていないので、IOExceptionが発生しているように見受けられますね。
原因を探るのに、soap/SOAPHTTP.scurlファイルのSOAPHTTPRPCPostAsyncWorker.cancelメソッドの最初の行でbreakpointを付ければ、デバッグが早いかと思います。
もしくは、パニックレポート(=スタックトレース)を見てみると、WSDK内のどこで落ちているかわかると思います。
hokada 様
ご返信ありがとうございます。
前者の cancel メソッドで止める手法は
メソッド内でステップ実行している最中にReadが終わってしまいそうです。
WSDLをパッケージとして使用してましたので
コールスタックでも追えず、困っておりました。
オープンソースでのDebugを試みるという、初歩的なことを忘れていました。。。
IOException自体をcatchさえできれば、握りつぶしても、
仕様的には問題ない(Readを受取らなくてもよい)ので、
どこで落ちてるのか探ってみます。
ありがとうございました。
> WSDLをパッケージとして使用してましたので
> コールスタックでも追えず、困っておりました。
確かにそうですね・・・。
> WSDLをパッケージとして使用してましたので
> コールスタックでも追えず、困っておりました。
恐らくpcurlをお使いいただいていると思うので、現在はpcurlへのマニフェストファイルにdelegate-toしているところ変更して、ソースコードを見るようにすれば、デバッグできると思います。
COM.CURL.WSDK.1.0 で非同期通信キャンセルを実装するような
方は今現在いないでしょうが・・・
最新の WSDK+UTIL-V7_090925 でも同じ実装でしたので、
結果を報告までに。
COM.CURL.WSDK.SOAP
SOAPHTTP.scurl 内
SOAPHTTPRPCPostAsyncWorker の cancel メソッド が
Code:
{method public open {cancel}:bool
{if not self._done? then
{self.close}
{if-non-null async-worker = self.async-worker then
set self.async-worker = null
let ret:bool = {async-worker.cancel}
{if ret then
{self.event-target.enqueue-event
{new SOAPHTTPRPCPostAsyncEvent,
null, true, null, null, null, null, null
}
}
set self._done? = true
}
{return ret}
}
}
{return false}
}
となっていましたが、
{self.close} の位置が、{async-worker.cancel}
の前であるため、イベント内でRead中に落ちるようです。
Code:
{method public open {cancel}:bool
{if not self._done? then
{if-non-null async-worker = self.async-worker then
set self.async-worker = null
let ret:bool = {async-worker.cancel}
{self.close}
{if ret then
{self.event-target.enqueue-event
{new SOAPHTTPRPCPostAsyncEvent,
null, true, null, null, null, null, null
}
}
set self._done? = true
}
{return ret}
}
{self.close}
}
{return false}
}
と改修してみると、落ちなくなりました。
ご回答くれた皆様有難う御座いました。