RestTemplate はグローバルに静的に宣言する必要がありますか? 質問する

RestTemplate はグローバルに静的に宣言する必要がありますか? 質問する

私は自分のコードで Java Callable Future を使用しています。以下は、future と callables を使用するメインコードです。

public class TimeoutThread {

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newFixedThreadPool(5);
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

以下は、Callable インターフェイスを実装するクラスですTask。ホスト名に応じて URL を生成し、 を使用して SERVERS を呼び出す必要がありますRestTemplate。最初のホスト名に例外がある場合は、別のホスト名の URL を生成し、呼び出しを試みます。

class Task implements Callable<String> {
    private static RestTemplate restTemplate = new RestTemplate();

    @Override
    public String call() throws Exception {

    //.. some code

    for(String hostname : hostnames)  {
            if(hostname == null) {
                continue;
            }
            try {
                String url = generateURL(hostname);         
                response = restTemplate.getForObject(url, String.class);

                // make a response and then break
                break;

            } catch (Exception ex) {
                ex.printStackTrace(); // use logger
            }
        }
    }
}

私の質問は、RestTemplate静的グローバル変数として宣言する必要があるかどうかです。それとも、このシナリオでは静的ではないほうがよいのでしょうか。

ベストアンサー1

staticどちらの方法、インスタンスでも問題ありません。

RestTemplateHTTP リクエストを行うための のメソッドはスレッドセーフなので、インスタンスRestTemplateごとにインスタンスがあるかTask、すべてのインスタンスで共有インスタンスがあるかTaskは関係ありません (ガベージ コレクションを除く)。

個人的には、クラスのRestTemplate外部に作成しTask、それをコンストラクターに引数として渡しますTask。(可能な場合は常に制御の反転を使用します。)

おすすめ記事