Curl Global Community
SOAP非同期通信のキャンセルについて - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: SOAP非同期通信のキャンセルについて (/showthread.php?tid=225)



SOAP非同期通信のキャンセルについて - onyo - 08-22-2011

こんばんは。度々古いVerの話で申し訳ないのですが

COM.CURL.WSDK1.0 を使用した非同期通信
キャンセルの実装について

SOAP通信のRead時に

SOAPHTTPRPCPostCaller の
async-call メソッドを使用し

ResponseをRead中

待ちうけイベントの
SOAPHTTPRPCPostAsyncWorker
cancel メソッドを使用すると

SOAPHTTPRPCPostCaller
IOException[HTTPAsyncWinInetBufferedByteInputStream @0x0D1AAC04]がオープンされていません。

が発生する事象が起きております。

Response が返却される前の キャンセルは Post→Close で正常キャンセルが可能です。

当方でもオープンソースを、追ってはいるのですが、
このエラーを回避または、ハンドリングしたいと思っておりますが
該当箇所がどの辺りになるのか、ご教授願えませんでしょうか。



RE: SOAP非同期通信のキャンセルについて - hokada - 08-22-2011

onyoさん
WSDKには詳しくないので参考になるかどうかわかりませんし、想像での回答ですが、
このエラー内容からは、非同期処理が開始して、AsyncWorker (ここではそのサブクラスのSOAPHTTPRPCPostAsyncWorker)が生成されているようですが、
取得すべきInputStreamは、まだオープンされていないので、IOExceptionが発生しているように見受けられますね。

原因を探るのに、soap/SOAPHTTP.scurlファイルのSOAPHTTPRPCPostAsyncWorker.cancelメソッドの最初の行でbreakpointを付ければ、デバッグが早いかと思います。

もしくは、パニックレポート(=スタックトレース)を見てみると、WSDK内のどこで落ちているかわかると思います。




RE: SOAP非同期通信のキャンセルについて - onyo - 08-22-2011

hokada 様

ご返信ありがとうございます。

前者の cancel メソッドで止める手法は
メソッド内でステップ実行している最中にReadが終わってしまいそうです。

WSDLをパッケージとして使用してましたので
コールスタックでも追えず、困っておりました。
オープンソースでのDebugを試みるという、初歩的なことを忘れていました。。。

IOException自体をcatchさえできれば、握りつぶしても、
仕様的には問題ない(Readを受取らなくてもよい)ので、
どこで落ちてるのか探ってみます。
ありがとうございました。







RE: SOAP非同期通信のキャンセルについて - hokada - 08-22-2011

> WSDLをパッケージとして使用してましたので
> コールスタックでも追えず、困っておりました。

確かにそうですね・・・。

> WSDLをパッケージとして使用してましたので
> コールスタックでも追えず、困っておりました。

恐らくpcurlをお使いいただいていると思うので、現在はpcurlへのマニフェストファイルにdelegate-toしているところ変更して、ソースコードを見るようにすれば、デバッグできると思います。



RE: SOAP非同期通信のキャンセルについて - onyo - 08-23-2011

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}
}


と改修してみると、落ちなくなりました。
ご回答くれた皆様有難う御座いました。