Comment utiliser RestTemplate efficacement dans l'environnement Multithread?

Je suis en train de travailler sur un projet dans lequel j'ai besoin de faire une URL HTTP appel à mon serveur qui est en cours d'exécution Restful Service qui retourne la réponse comme une Chaîne JSON.

Ci-dessous mon code principal qui est à l'aide de la future et callables -

public class TimeoutThreadExample {

    private ExecutorService executor = Executors.newFixedThreadPool(10);

    public String getData() {
        Future<String> future = executor.submit(new Task());
        String response = null;

        try {
            response = future.get(100, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return response;
    }
}

Ci-dessous est mon Task classe qui implémente l' Callable interface et utilise le RestTemplate...

class Task implements Callable<String> {

    private RestTemplate restTemplate = new RestTemplate();

    public String call() throws Exception {

        String url = "some_url";
        String response = restTemplate.getForObject(url, String.class);

        return response;
    }
}

Et maintenant j'ai le code ci-dessous dans une autre classe DemoTest qui appelle à la getData méthode dans TimeoutThreadExample classe 5000 times de façon séquentielle -

public class DemoTest { 
   public static void main(String[] args) {

        TimeoutThreadExample bc = new TimeoutThreadExample();

        for (int i = 0; i <= 5000; i++) {
        // TimerTest timer = TimerTest.getInstance(); //line 1
            bc.getData();
        // timer.getDuration(); //line 2
        }
    }
}       

Donc ma question est doit RestTemplate être statique ici dans mon Task class comme si je le vois bien, je suis à recréer l'ensemble du pool de connexion pour chaque demande dans RestTemplate qui n'est pas la bonne façon, je suppose..

REMARQUE: Si je fais RestTemplate statique, alors que je vois mieux les performances de bout en bout par rapport aux non statique RestTemplate après commentant ligne1 et ligne2 dans DemoTest classe qui mesure la performance.

En général, quelle est la bonne façon de l'utiliser RestTemplate dans le Multithreading environnement? Actuellement, je suis en appelant de manière séquentielle getData méthode de 5000 fois une par une, mais certains clients de les appeler dans un multithread façon donc besoin de savoir quel est le meilleur moyen d'avoir des RestTemplate dans un environnement multithread..

Peut-être d'utiliser ConnectionFactory dans le RestTemplate constructeur? Toutes les pensées?

Mise à JOUR:-

public class TimeoutThreadExample {

    private ExecutorService executor = Executors.newFixedThreadPool(10);
    private RestTemplate restTemplate = new RestTemplate();

    public String getData() {
        Future<String> future = executor.submit(new Task(restTemplate));
        String response = null;

        try {
            response = future.get(100, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return response;
    }
}

Et en dessous de mon TaskClass -

class Task implements Callable<String> {

    private RestTemplate restTemplate;

    public Task(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String call() throws Exception {

        String url = "some_url";
        String response = restTemplate.getForObject(url, String.class);

        return response;
    }
}

OriginalL'auteur AKIWEB | 2014-01-20