2

Opentravel Alliance スキーマの非常に大きな (900 以上のクラス) セットから生成されたオブジェクトの JAXB データバインディングを使用する JAX-WS サービスを作成しようとしています。

Web メソッドが参照しない限り、さまざまなサーブレット コンテナー (Jetty、Tomcat6/7 など) に JAX-WS サービスを含む war (適切な web.xml および sun-jaxws.xml を使用) を正常に展開できます。私のJAXBオブジェクトのいずれか。たとえば、これは機能します:

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class OTAService {
    public String sayHello(final String name) {
        return "Hello " + name + "!";
    }
}

ただし、注釈を追加するか、オブジェクトを直接参照することにより、JAXB データバインディングを使用するように Web メソッドを変更すると、@XmlSeeAlso試したすべてのサーブレットコンテナーが無期限に (1 時間以上) エラーなしでハングし、開始されません。

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({OTAHotelResNotifRQ.class, OTAHotelResNotifRS.class})
public class OTAService {
    @Action(input = "OTA_HotelResNotif")
    @WebMethod(operationName = "OTA_HotelResNotif", action = "OTA_HotelResNotif")
    public @WebResult OTAHotelResNotifRQ tokenizeOtaHotelResNotifRq(
    @WebParam(partName = "OTA_HotelResNotifRQ", name = "OTA_HotelResNotifRQ", 
    targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
    final OTAHotelResNotifRQ request) {
        return request;
    }
}

JAXB および JAX-WS API とランタイム jar を含む必要なすべての jar が war の /lib ディレクトリに存在することを確認しました。

私の JAX-WS プロジェクトに必要な依存関係である私の JAXB オブジェクトを含む jar は、このプロジェクトmvn clean installで実行することによって作成し、ローカル リポジトリにインストールできます。

ここで入手できる私の JAX-WS プロジェクトは、 を呼び出すことで Jetty で実行できますmvn clean package jetty:run-war

sayHello単純なメソッドのみが存在する場合、Jetty がすぐに起動することに気付くでしょう。ただし、JAXB メソッドのコメントを外すと、JAX-WS サーブレットをインスタンス化しようとしているときに、Jetty および私が試した他のすべてのサーブレット コンテナーが永久にハングします。 JAXB データバインディングを使用した Web メソッドが私の戦争の展開を妨げる理由を誰かが説明できますか? フリーズ動作はさまざまなサーブレット コンテナーで同じであるため、見逃している重要なステップがあるに違いないと感じています。ただし、エラーは報告されず、コンテナーの起動がハングアップするだけなので、続行する方法がわかりません。

4

1 に答える 1

3

これは、opentravel プロジェクトの JAXB オブジェクトの数が多かったことが原因のようです。VisualVM をランチャー プロセスに接続してメモリをサンプリングしたところ、何らかの理由で JAXB がオブジェクト ツリー全体を歩いてプリロード/キャッシュしているように見えました (おそらく、スキーマを再構築して WSDL に含めるためですか?)。

この質問-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=trueへの回答で説明されているように設定し、メモリを増やして Jetty をすばやく起動しました。 -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

実行時のパフォーマンスへの影響が許容できるトレードオフになるかどうかはまだわかりません。

于 2012-11-01T20:34:59.643 に答える