3

JAX WS で Java Web サービスの勉強を始めています。私が読んでいる本の最初の章では、Java SE のみを使用して単純な jax ws Web サービスを構築およびデプロイする方法を示しています。特に、Web サービスは Endpoint クラスを通じて公開されます。Web サービスを公開した後、作成者は次のように指定します。この章の最後に、1 つのハングした要求が他の要求をブロックしないように、エンドポイントが要求を同時に処理する方法を示します。」

これを確認するために、2 つのスレッドを持つ Web サービスに 2 つのリクエストを送信しようとしました。コードは次のとおりです。

@WebService(endpointInterface = "ProveVelociJava.WS.MyWsWithJavaSE.SayHello")
public class SayHelloImpl implements SayHello {
    public String greetings(String param) {
        System.out.println("\nStarting " + param + "...\n");    
        if(param.equals("miao")) {      
            try {           
                Thread.sleep(9000);
            }
            catch(Exception e) {}
        }
        System.out.println("Ended " + param + "\n\n");
        return "Hi, " + param;
    }
}

public class SayHelloPublisher {
    public static void main(String[ ] args) {   
        // 1st argument is the publication URL
        // 2nd argument is an SIB instance
        Endpoint.publish("http://127.0.0.1:9899/say", new SayHelloImpl());
    }
}

class MyClient extends Thread {
    private static URL url;
    private static QName qname;
    private static Service service;
    private static SayHello eif;

    static {
        try {
            url = new URL("http://127.0.0.1:9899/say?wsdl");
            qname = new QName("http://MyWsWithJavaSE.WS.ProveVelociJava/", "SayHelloImplService");
            service = Service.create(MyClient.url, MyClient.qname);
            // Extract the endpoint interface, the service "port".
            eif = service.getPort(SayHello.class);
        }
        catch(Exception e) {}
    }
    private String name;
    public MyClient(String n) {
        name = n;
    }
    public void run() {
        System.out.println(MyClient.eif.greetings(this.name));
    }
    public static void main(String args[ ]) throws Exception {  
        MyClient t1 = new MyClient("miao");
        MyClient t2 = new MyClient("bau");
        t1.start();
        t2.start();
    }
}

MyClient クラスを起動すると、"miao" というスレッドがリクエストを送信してからスリープ状態になります。ただし、「bau」と呼ばれるスレッドは前のスレッドを待たず、その要求はすぐに満たされます。

何か不足していますか?Javaスレッドを使用して複数のリクエストをシミュレートできますか?

助けてくれてありがとう、ニコ。

4

3 に答える 3

2

JAX-WS 2.0仕様をダウンロードしましたが、読んでいる本の内容が反証されています。

「エンドポイントは、Webサービスの実装(ここでは実装者と呼ばれます)として機能するオブジェクトといくつかの構成情報で構成されます...エンドポイントは通常、同時リクエストを処理するために呼び出されるため、その実装者は複数のスレッドをサポートするように作成する必要があります。同期キーワードは、コードのクリティカルセクションへのアクセスを制御するために通常どおり使用できます。着信要求のディスパッチに使用されるスレッドをより細かく制御するために、アプリケーションは使用するエグゼキュータを直接設定できます。」

http://jcp.org/aboutJava/communityprocess/final/jsr224/index.html、セクション5.2.2「公開」、67ページ)

この本はJAX-WS2.1について語っていますが、私はそのバージョンの仕様をダウンロードすることができませんでした。とにかく、JAX-WS 2.2仕様(現在のバージョン)は、Endpointクラスの並行性を確認しています(上記と同じ文が含まれています)。

その本の著者が正確に何を意味するのかわかりません。

于 2012-07-28T16:48:55.607 に答える
1

遅いですが、役立つかもしれません。

Endpoint.publish(Url, ServiceImplObj) は、指定された URL で Web サービスを公開します。いいえ。これは、jvm 自体によって処理される軽量のデプロイメントであるため、要求処理に割り当てられたスレッドの数は、実際には jvm の制御下にあります。

より明確にするために、サービス側で現在のスレッド名を出力すると、jvm によって管理されるスレッド プールからサービス スレッドが割り当てられていることがわかります。

[pool-1-thread-1]: Response[57]:
[pool-1-thread-5]: Response[58]:
[pool-1-thread-4]: Response[59]:
[pool-1-thread-3]: Response[60]:
[pool-1-thread-6]: Response[61]:
[pool-1-thread-6]: Response[62]:
于 2012-12-12T16:35:34.697 に答える