私は自分のコードで 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
どちらの方法、インスタンスでも問題ありません。
RestTemplate
HTTP リクエストを行うための のメソッドはスレッドセーフなので、インスタンスRestTemplate
ごとにインスタンスがあるかTask
、すべてのインスタンスで共有インスタンスがあるかTask
は関係ありません (ガベージ コレクションを除く)。
個人的には、クラスのRestTemplate
外部に作成しTask
、それをコンストラクターに引数として渡しますTask
。(可能な場合は常に制御の反転を使用します。)