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」というエラーが出る。