WebServices - Axis

WebServices - Axis - FAQ/Wiki

[翻訳者注: このページは FAQ/Wiki ページを静的に翻訳したものです。最新の内容につきましては本家 FAQ/Wiki をご覧下さい。]

クライアント関連

  1. [WSDL2Java スタブを使用する際に、どのようにしてタイムアウトを設定するのですか?] [編集日時 2004年5月24日pm8:22 版]

    質問: WSDL2Java スタブを使用する際に、どのようにしてタイムアウトを設定するのですか?

    回答: 生成されたスタブ全てが拡張する org.apache.axis.client.Stub クラスに setTimeout メソッドがあります。

    ここに Foo という名前のサービスにタイムアウトを設定する方法を示します。

     FooServiceLocator loc = new FooServiceLocator();
     FooService binding = loc.getFooService();
     org.apache.axis.client.Stub s = (Stub) binding;
     s.setTimeout(1000);  // 1秒。ミリ秒で
    

    Axis 1.1 以降のデフォルトのタイムアウトは60秒です。Axis 1.0 にはデフォルトのタイムアウトがありませんでした(つまりデフォルト0秒)。このタイムアウト値は HTTP ソケットに設定されるものであって、Axis 1.1 にはない実装を必要とするコネクションタイムアウトではありません。

    質問: setTimeout(15*10000)、あるいはより大きな値を設定して http の url に接続すると以下のエラーがでます。ただし localhost の url ではエラーがでません。

     java.net.ConnectException?: Connection timed out: connect
            at java.net.PlainSocketImpl?.socketConnect(Native Method)
            at java.net.PlainSocketImpl?.doConnect(PlainSocketImpl?.java:305)
            at java.net.PlainSocketImpl?.connectToAddress?(PlainSocketImpl?.java:171)
            at java.net.PlainSocketImpl?.connect(PlainSocketImpl?.java:158)
            at java.net.Socket.connect(Socket.java:452)
            at java.net.Socket.connect(Socket.java:402)
            at sun.net.NetworkClient?.doConnect(NetworkClient?.java:139)
            at sun.net.www.http.HttpClient.openServer(HttpClient.java:402)
            at sun.net.www.http.HttpClient.openServer(HttpClient.java:618)
            at sun.net.www.http.HttpClient.<init>(HttpClient.java:306)
            at sun.net.www.http.HttpClient.<init>(HttpClient.java:267)
            at sun.net.www.http.HttpClient.New(HttpClient.java:339)
            at sun.net.www.http.HttpClient.New(HttpClient.java:320)
            at sun.net.www.http.HttpClient.New(HttpClient.java:315)
            at sun.net.www.protocol.http.HttpURLConnection?.plainConnect(HttpURLConne?ction.java:512)
            at sun.net.www.protocol.http.HttpURLConnection?.connect(HttpURLConnection?.java:489)
            at sun.net.www.protocol.http.HttpURLConnection?.getInputStream?(HttpURLCon?nection.java:617)
            at java.net.URL.openStream(URL.java:913)
            at org.apache.xerces.readers.DefaultReaderFactory?.createReader(DefaultRe?aderFactory.java:149)
            at org.apache.xerces.readers.DefaultEntityHandler?.startReadingFromDocume?nt(DefaultEntityHandler?.java:491)
            at org.apache.xerces.framework.XMLParser.parseSomeSetup?(XMLParser.java:312)
            at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1080)
            at org.apache.xerces.jaxp.DocumentBuilderImpl?.parse(DocumentBuilderImpl?.java:195)
            at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:322)
            at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:367)
            at org.apache.axis.wsdl.symbolTable.SymbolTable?.populate(SymbolTable?.java:384)
            at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:245)
            at java.lang.Thread.run(Thread.java:534)java.net.ConnectException?: 
    Connection timed out: connect at java.net.PlainSocketImpl?.socketConnect(Native Method)
            at java.net.PlainSocketImpl?.doConnect(PlainSocketImpl?.java:305)
            at java.net.PlainSocketImpl?.connectToAddress?(PlainSocketImpl?.java:171)
            at java.net.PlainSocketImpl?.connect(PlainSocketImpl?.java:158)
            at java.net.Socket.connect(Socket.java:452)
            at java.net.Socket.connect(Socket.java:402)
            at sun.net.NetworkClient?.doConnect(NetworkClient?.java:139)
            at sun.net.www.http.HttpClient.openServer(HttpClient.java:402)
            at sun.net.www.http.HttpClient.openServer(HttpClient.java:618)
            at sun.net.www.http.HttpClient.<init>(HttpClient.java:306)
            at sun.net.www.http.HttpClient.<init>(HttpClient.java:267)
            at sun.net.www.http.HttpClient.New(HttpClient.java:339)
            at sun.net.www.http.HttpClient.New(HttpClient.java:320)
            at sun.net.www.http.HttpClient.New(HttpClient.java:315)
            at sun.net.www.protocol.http.HttpURLConnection?.plainConnect(HttpURLConne?ction.java:512)
            at sun.net.www.protocol.http.HttpURLConnection?.connect(HttpURLConnection?.java:489)
            at sun.net.www.protocol.http.HttpURLConnection?.getInputStream?(HttpURLCon?nection.java:617)
            at java.net.URL.openStream(URL.java:913)
            at org.apache.xerces.readers.DefaultReaderFactory?.createReader(DefaultRe?aderFactory.java:149)
            at org.apache.xerces.readers.DefaultEntityHandler?.startReadingFromDocume?nt(DefaultEntityHandler?.java:491)
            at org.apache.xerces.framework.XMLParser.parseSomeSetup?(XMLParser.java:312)
            at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1080)
            at org.apache.xerces.jaxp.DocumentBuilderImpl?.parse(DocumentBuilderImpl?.java:195)
            at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:322)
            at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:367)
            at org.apache.axis.wsdl.symbolTable.SymbolTable?.populate(SymbolTable?.java:384)
            at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:245)
            at java.lang.Thread.run(Thread.java:534)
    

    他に設定が必要ですか?


  2. [プロキシはどのようにして設定するのですか?] [編集日時 2004年3月16日am5:16 版]

    プロキシはどのようにして設定するのですか?

    回答: プロキシの設定にはいくつかの方法があります。

    最初の方法は、プロキシ情報を指定するシステムプロパティを設定する方法です。

    これを行うには、Java を起動する際に以下のオプションをコマンドラインに追加します。

    -Dhttp.proxyHost=proxy.mycompany.com -Dhttp.proxyPort=80 -Dhttp.proxyUser=myusername -Dhttp.proxyPassword=mypassword

    2つめの方法は、Java 1.4.x での話ですが、[Authenticator] を設定する方法です。

    以下のようにしてコードレベルでシステムプロパティを設定することもできます。

    System.setProperty("http.proxyHost","192.168.100.14");

    System.setProperty("http.proxyPort","4480");

    この方法は、proxy plus 等のようなプロキシアプリケーションを使用する人のためのものです。

    質問: プロキシサポートに関して警告や経験則などはありますか?

    回答: Java の現在のリリースは、基本認証を使用するプロキシサーバしかサポートしていません。nutshell ではユーザ名とパスワードが base64 でエンコードされて、http リクエストのヘッダに追加されます。詳細は [How to Base-64 (Base-64 の仕方)] をご覧下さい。

    Windows の Java 1.4.2 では、Sun は NTLM 認証のサポートを追加したようです。詳細は [Enhancements and Changes in Java 2 SE Version 1.4.2 (Java 2 SE バージョン 1.4.2 における機能強化と変更)] をご覧下さい。

    NTLM 認証は一般的に Microsoft Proxy Server で使用されます。サードパーティ製ソフトウェアを使用せずに、Java の以前のリリースのもとで直接 NTLM 認証を使用するのは不可能です。(無駄な時間を過ごさないで下さい)。

    Microsoft Proxy Server に関する問題の詳細はこちらをご覧下さい。[Unofficial Java Web Start/JNLP FAQ (アンオフィシャルな Java Web Start/JNLP FAQ)]

    NTLM の技術的な議論についてはこちらをご覧下さい。[The NTLM Authentication Protocol (NTLM 認証プロトコル)]

    現在のところ、NTLM サポートに関しては [Jakarta Commons HttpClient] を使用することをお勧めします。


  3. [Axis は HTTP 1.1 Keep-Alive ヘッダをサポートしていますか?] [編集日時 2003年11月24日pm5:32 版]

    質問: Axis は HTTP 1.1 Keep-Alive ヘッダをサポートしていますか?

    回答: [HTTP 1.1 specification (HTTP 1.1 仕様)] では、HTTP 接続のオープンとクローズに関連するオーバヘッドを最小限にするために、Keep-Alive ヘッダについて言及しています。

    実際のところ Keep-Alive は、会社の設定ではプロキシサーバがあるので特に価値があるわけではありません。

    Keep-Alive ヘッダを使用したい場合は、[Jakarta Commons HttpClient package (Jakarta Commons HttpClient パッケージ)] と共に org.apache.axis.transport.http.CommonsHTTPSender クラスを使用すべきです。

    関連するトピック: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16522


  4. [AXIS クライアントに client-config.wsdd を通知させるにはどうすればいいのですか?] [編集日時 2004年4月1日am5:21 版]

    AXIS に client-config.wsdd を見つけさせるにはどうすればいいのですか?

    AXIS はクライアント側でハンドラの使用をサポートしていて、[WS-FX] プロジェクトの多くはこの特徴を利用して実装されています。クライアントの設定情報は client-config.wsdd に含まれています。

    デフォルトでは、AXIS のクライアントコードは2箇所でこのファイルを探します。

    1) まずは、AXISが起動しているプロセスの作業ディレクトリを確認します。もしそこで client-config.wsdd が見つかればそれを使用します。

    2) もし client-config.wsdd が見つからなければ org/apache/axis/client パッケージの中のクラスパスを確認します。

    (もし設定ファイルを別々の場所に置きたいのであれば) client-config.wsdd ファイルの場所を明示的に指定することも可能です。これを行うには、コマンドラインを使用して以下のようにシステムプロパティを設定する必要があります。

    java -Daxis.ClientConfigFile=/location/of/client-config.wsdd ...
    

    これは Antで、<java> にネストされた <systemproperty> 要素を使用して行うこともできます。

    <sysproperty key="axis.ClientConfigFile" value="/location/of/client-config.wsdd">
    

  5. [Apache Jakarta Commons-HttpClient を使用して接続をプールするには、Axis クライアントをどのように設定すればいいのですか?] [編集日時 2004年5月26日am9:49 版]

    [Apache Jakarta Commons-HttpClient] を使用して接続をプールするには、Axis クライアントをどのように設定すればいいのですか?

    回答: もしクライアントがWebアプリケーションとしてデプロイされているのであれば、CLASSPATH あるいは WEB-INF/lib に commons-httpclient をインストールする必要があります。もし Axis をソースからビルドするのであれば、Axis 依存ディレクトリに commons-httpclient を置いて CommonsHTTPSender クラスがビルドされるようにする必要があります。

    次に、Axis が HTTP を介してメッセージを送る、あるいは受け取る際に、標準的な HTTPSender の代わりに CommonsHTTPSender を使用するように設定された client-config.wsdd をインストールする必要があります。ここに例を示します。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <deployment name="commonsHTTPConfig" 
    xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      <transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" />
      <transport name="local" pivot = "java:org.apache.axis.transport.local.LocalSender" />
      <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" />
    </deployment>

    最後に、コネクションプールのデフォルトの設定 (プールサイズ、タイムアウトなど) を調整します。これらは org.apache.axis.components.net.CommonsHTTPClientProperties インターフェースに定義されていて、Axis のプラグ可能な全てのコンポーネントから使用される AxisProperties? API を使用して設定することができます。それらの設定に対して特別な調整を行う必要がある場合は、CommonsHTTPClientProperties インターフェースの自分用の実装を提供することもできます。そのためには commons-discovery API を使用します。(これには Axis 1.2 が必要です)


  6. [Axis で Web Start を使用するにはどうすればいいのですか?] [編集日時 2003年11月20日pm11:38 版]

    質問: [Web Start] から立ち上がるアプリケーションで Axis を使用することはできますか?

    回答: はい。あなたのアプリケーションに含まれる全ての jar を署名して、全てのコードが適切なセキュリティパーミッションで実行されることを保証する必要があります。Web Start により強制されるセキュリティモデルは、アプリケーションが、ダウンロードされたサーバ以外のサーバに接続をすることを防ぎます。

    Web Start と 認証プロキシサーバの使用で、報告された問題があることに注意してください。Axis でプロキシサーバを使用する際の詳細については /AxisProxy をご覧下さい。

    さらに問題があります。Java Web Start はシステムプロパティ "proxyHost" と "proxyPort" を設定しますが、Axis は "http.proxyHost" と "http.proxyPort" を必要とします。ですから私のクライアントでは以下のコードを使用します。

        // Java Web Start はシステムプロパティ "proxyHost" と "proxyPort" を設定しますが、Axis は "http.proxyHost" と "http.proxyPort" を必要とします!
        // https.* も設定する必要がありますか?
        if ((null == System.getProperty ("http.proxyHost")) && (null != System.getProperty ("proxyHost"))) {
          System.setProperty ("http.proxyHost", System.getProperty ("proxyHost"));
        }
        if ((null == System.getProperty ("http.proxyPort")) && (null != System.getProperty ("proxyPort"))) {
          System.setProperty ("http.proxyPort", System.getProperty ("proxyPort"));
        }
    

    Web Start に関するさらなる情報と jar ファイルの署名についてはこちらをご覧下さい。

      [Unofficial Java Web Start/JNLP FAQ]
    [Sun Java Web Start FAQ ]
    

  7. [Axis クライアントでどのようにしてハンドラを設定すればいいのですか?] [編集日時 2004年5月2日am5:18 版]

    Axis クライアントでどのようにしてハンドラを設定すればいいのですか?

    サービスオブジェクトをインスタンス化する際に、自分用の EngineConfiguration を提供します。自分用の設定を構築する方法はいくつかあります。

    • サーバ側のデプロイメントディスクリプタのように、WSDD-XML を使用する。
    この例は HTTP-transport-chain のリクエストフローとレスポンスフローにおける SimpleSessionHandler を設定します。
         <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="..." >
           <handler type="java:org.apache.axis.handlers.SimpleSessionHandler"
                    name="SimpleSessionHandler"/>
           <transport name="http"
                      pivot="java:org.apache.axis.transport.http.HTTPSender">
             <requestFlow><handler type="SimpleSessionHandler"/></requestFlow>
             <responseFlow><handler type="SimpleSessionHandler"/></responseFlow>
           </transport>"
         </deployment>
    
    この与えられた文字列から EngineConfiguration を得るコードは次のようになります。
         EngineConfiguration clientConfig = (EngineConfiguration) new XMLStringProvider(WSDDString);
    
    • EngineConfiguration インターフェースを実装する自分用のクラスを構築します。
    • 部分的に設定可能な既存の EngineConfiguration クラスを使用します。
    例えば SimpleProvider は Transport chain のデプロイを認めます。
    以下の例は上記の WSDD と同じことを行います。
         import org.apache.axis.configuration.SimpleProvider;
         import org.apache.axis.EngineConfiguration;
         import org.apache.axis.Handler;
         import org.apache.axis.SimpleChain;
         import org.apache.axis.SimpleTargetedChain;
         import org.apache.axis.handlers.SimpleSessionHandler;
         import org.apache.axis.transport.http.HTTPSender;
         import org.apache.axis.transport.http.HTTPTransport;
    
         EngineConfiguration createClientConfig()
         {
           SimpleProvider clientConfig=new SimpleProvider();
           Handler sessionHandler=(Handler)new SimpleSessionHandler();
           SimpleChain reqHandler=new SimpleChain();
           SimpleChain respHandler=new SimpleChain();
           reqHandler.addHandler(sessionHandler);
           respHandler.addHandler(sessionHandler);
           Handler pivot=(Handler)new HTTPSender();
           Handler transport=new SimpleTargetedChain(reqHandler, pivot, respHandler);
           clientConfig.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME,transport);
    
           return clientConfig;   
         }
    
    

    WSDL2Java が生成したコードを使用する際、(Service を拡張した) XYServiceLocator は設定を与えるコンストラクタを提供しません。生成されたコードを修正したくなければ、以下のようにして対処することができます。

           EngineConfiguration clientConfig=getClientConfig();
           XYServiceLocator service=new XYServiceLocator();
           service.setEngineConfiguration(clientConfig);
           service.setEngine(new AxisClient(clientConfig));
           XY myservice=service.getmyservice();