wsimportコマンドで非同期クライアント用クラスを生成する方法
JAX-WSでは非同期プログラミング・モデルがサポートされているのだが、wsimportコマンドを使用して自動生成したJavaクラスには、デフォルトでは非同期のインタフェースが含まれていない。
しかし、以下のような定義ファイルを準備し、wsimportコマンドの-bオプションで読み込ませる事で、非同期のインタフェースを生成する事が可能となる。
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocaption="http://localhost/hoge/moge?WSDL" xmlns="http://java.sun.com/xml/ns/jaxws"> <bindings node="wsdl:definitions"> <package name="hoge.client"/> <enableAsyncMapping>true</enableAsyncMapping> </bindings> </bindings>
また、上記の定義は全てのインタフェースを非同期にするという指定であるが、特定のインタフェースだけを非同期にしたい場合には、以下のような定義ファイルにする*1。
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocaption="http://localhost/hoge/moge?WSDL" xmlns="http://java.sun.com/xml/ns/jaxws"> <bindings node="wsdl:definitions/ wsdl:portType[@name='getData']/ wsdl:operation[@name='getBooData']"> <package name="hoge.client"/> <enableAsyncMapping>true</enableAsyncMapping> </bindings> </bindings>
参考:https://jax-ws.dev.java.net/nonav/2.1.3/docs/asynch.html
なお、NetBeans IDE等では、非同期Webサービスを容易に開発する機能がサポートされているため、上記のようなマニュアル作業は不要である。NetBeans IDEを使った具体的な方法については、以下のページで分かりやすく説明されている。
参照:http://blogs.sun.com/katakai/entry/asynchronously_calling_a_jax_ws
*1:戻り値がvoidのインタフェースに関しては非同期に出来ず、「[ERROR] wsimport failed to generate async response bean for operation: xxxxx」というエラーが出る。