5

Spring REST サービスへの REST 呼び出しを行う多数のメソッドを持つサービス クラスがあります。各メソッドは次のようになります。

public void getUser() {

        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        WebResource service = client.resource(RESOURCE_URL);


        // Get response as String
        String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN)
                .get(String.class);

        return response;
    }

上記は正常に動作しますが、メソッドが呼び出されるたびに、ClientConfig、Client、および WebResource の新しいインスタンスが作成されることが少し心配です。上記を変更し、ClientConfig、Client、および WebResource をクラス レベルのインスタンス変数として作成すると、どのような副作用がありますか? つまり、次のように変更します。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(RESOURCE_URL);

public void getUser() {         

        // Get response as String
        String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN)
                .get(String.class);

        return response;
    }

 public void getUserAccount() {         

        // Get response as String
        String response = service.path("/getUserAccount").accept(MediaType.TEXT_PLAIN)
                .get(String.class);

        return response;
    }

複数のユーザーが同時に異なるメソッドを呼び出すと、上記は失敗する可能性がありますか? 上記を構成する最良の方法は何ですか?

Jersey のクライアント メソッドに close() メソッドがあれば、メソッドをそのままにして、メソッド内のリソースを閉じることができたはずです。

4

1 に答える 1

12

ジャージーのドキュメントから:

クライアントの場合:

WebResource のインスタンスを作成するメソッドはスレッドセーフです。構成やフィルターを変更するメソッドは、スレッドセーフであるとは限りません。

Client インスタンスの作成はコストのかかる操作であり、インスタンスは多くのリソースを使用および保持する場合があります。したがって、同じ構成設定を必要とする WebResource インスタンスの作成には Client インスタンスを再利用することをお勧めします。

WebResourceの場合:

リクエストを作成してレスポンスを返すメソッドはスレッドセーフです。フィルターを変更するメソッドは、スレッドセーフであるとは限りません

の明示的な同時実行に関するドキュメントはありませんがClientConfig、マルチスレッド環境で安全に使用できることはソース コードから明らかです。このClientクラスはスレッドセーフでもあり、WebResource考慮する必要があるのは だけです。そのドキュメントに基づいて、WebResource各スレッドに新しいものを捧げます。つまり、コードは次のようになります。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);

public void getUser() {         
    WebResource service = client.resource(RESOURCE_URL);

    // Get response as String
    String response = service
        .path("/addUser")
        .accept(MediaType.TEXT_PLAIN)
        .get(String.class);

        return response;
}
于 2013-01-13T17:07:05.173 に答える