Thread Rating:
  • 535 Vote(s) - 2.75 Average
  • 1
  • 2
  • 3
  • 4
  • 5
SOAP非同期通信のキャンセルについて
08-22-2011, 06:05 PM,
#1
SOAP非同期通信のキャンセルについて
こんばんは。度々古いVerの話で申し訳ないのですが

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

SOAP通信のRead時に

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

ResponseをRead中

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

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

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

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

当方でもオープンソースを、追ってはいるのですが、
このエラーを回避または、ハンドリングしたいと思っておりますが
該当箇所がどの辺りになるのか、ご教授願えませんでしょうか。
08-22-2011, 06:48 PM, (This post was last modified: 08-22-2011, 06:52 PM by hokada.)
#2
RE: SOAP非同期通信のキャンセルについて
onyoさん
WSDKには詳しくないので参考になるかどうかわかりませんし、想像での回答ですが、
このエラー内容からは、非同期処理が開始して、AsyncWorker (ここではそのサブクラスのSOAPHTTPRPCPostAsyncWorker)が生成されているようですが、
取得すべきInputStreamは、まだオープンされていないので、IOExceptionが発生しているように見受けられますね。

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

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

08-22-2011, 07:42 PM,
#3
RE: SOAP非同期通信のキャンセルについて
hokada 様

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

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

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

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




08-22-2011, 07:51 PM, (This post was last modified: 08-22-2011, 07:52 PM by hokada.)
#4
RE: SOAP非同期通信のキャンセルについて
> WSDLをパッケージとして使用してましたので
> コールスタックでも追えず、困っておりました。

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

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

恐らくpcurlをお使いいただいていると思うので、現在はpcurlへのマニフェストファイルにdelegate-toしているところ変更して、ソースコードを見るようにすれば、デバッグできると思います。
08-23-2011, 09:24 PM, (This post was last modified: 08-23-2011, 09:27 PM by onyo.)
#5
RE: SOAP非同期通信のキャンセルについて
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}
}


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

Forum Jump:


Users browsing this thread:
2 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('225')