RestTemplate doit être statique déclarés globalement?
Je suis à l'aide de Java Appelable Avenir dans mon code. Ci-dessous mon code principal qui utilise l'avenir et 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();
}
}
Ci-dessous est mon Task
classe qui implémente l'Appelable de l'interface et j'ai besoin de générer l'URL en fonction du nom d'hôte que nous avons, et puis faire un appel à des SERVEURS à l'aide de RestTemplate
. Si il n'y a aucune exception dans le premier domaine, je vais générer l'URL pour un autre nom d'hôte et je vais essayer de faire un appel.
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
}
}
}
}
Donc ma question dois-je déclarer RestTemplate
comme statique de la variable globale? Ou il ne devrait pas être statique dans ce scénario?
OriginalL'auteur AKIWEB | 2014-01-15
Vous devez vous connecter pour publier un commentaire.
Il n'a pas d'importance de toute façon,
static
ou de l'instance.RestTemplate
's méthodes pour effectuer les requêtes HTTP sont thread-safe, donc si vous avez unRestTemplate
instance parTask
instance ou d'une instance partagée pour tous lesTask
cas n'est pas pertinent (sauf pour la collecte des ordures).Personnellement, je voudrais créer le
RestTemplate
à l'extérieur de laTask
classe et la passer en argument à uneTask
constructeur. (Utilisation de l'Inversion de Contrôle chaque fois que possible.)Bon, c'est ce que je voulais dire, l'Inversion de contrôle dans la mesure du possible. L'utilisation d'un conteneur d'injection de dépendances, si cela est possible.
Merci pour vos suggestions.. Pouvez-vous fournir un exemple de la façon dont vous créez RestTemplate en dehors de la classe et de le passer en argument à la Tâche constructeur?
Créer un
Task
constructeur qui accepte unRestTemplate
paramètre. Alors nenew Task(restTemplate)
oùrestTemplate
est unRestTemplate
de référence géré par l'appelant.Je Vous remercie.. Mais quel sera l'avantage de cette? Juste essayer de comprendre quelle est la différence avec la façon dont je suis en train de faire et vous le suggérez?
OriginalL'auteur Sotirios Delimanolis
À partir d'une simultanéité point de vue, il n'a pas d'importance.
RestTemplate
est thread-safe, donc une seule instance ou de plusieurs instances est sans importance pour le bon fonctionnement du programme.Mais vous pouvez envisager d'
AsyncRestTemplate
au lieu de cela, comme indiqué ici.Aussi, comme d'autres, mentionner, vous devriez envisager un Cio approche pour séparer la création de votre client RESTE de son utilisation. Cette article de Martin Fowler est de la séminal de discussion sur le sujet.
J'ai aussi la même question here liées à
RestTemplate
qui vous m'avez aidé la dernière fois. Si possible, pouvez-vous m'aider ici? Toute aide est grandement appréciée.Je ne vois pas synchronisés utilisé n'importe où dans le RestTemplate ou les classes de la mise en œuvre de l'exécution de la demande de la logique. Comment est-il "thread-safe"?
OriginalL'auteur Vidya
Dans mon cas particulier, j'ai trouvé quelques raisons pour lesquelles on peut vouloir avoir plus d'une instance de
RestTemplate
.Le RestTemplate est une manière d'invoquer un point de terminaison distant, mais l'intégration HTTP semble trompeusement simple et quand vous commencer à trouver des scénarios spéciaux qui ne s'appliquent pas à l'ensemble de vos appels d'API, c'est quand vous réalisez que vous avez besoin d'un moyen de définir certains paramètres dans une base de cas par cas.
Exemples de tels scénarios sont les suivants:
Concernant le point n ° 2, vous ne pouvez modifier le délai d'expiration de la requestFactory même après votre RestTemplate est initialisé? Donc ServiceA.methodA() peut définir dynamiquement le délai d'attente juste avant de faire la demande, et même pour ServiceB.methodA(). Corrigez-moi si je me trompe parce que je suis en train de parvenir à une bonne conception de mon projet. Merci
D'accord, nous aussi, ayant une situation similaire. Dans notre application, nous avons besoin de vous connecter à 3/de plus en plus différents, HTTP/HTTPS serveur et pour chacun nous avons à définir des délais d'attente et une personnalisation de l'HTTPClient. Ainsi, pour certains, nous devons utiliser un restTemplate de
HttpComponentsClientHttpRequestFactory
qui ont une fonction de l'utilisation de ses propres configurable client et pour quelques SimpleClientHttpRequestFactory. Et donc à la séparation des RestTemplate (si minimuim de même type peut être utilisé). Encore, si quelqu'un a des goodway en dehors de cela merci de faire partager.OriginalL'auteur Edwin Dalorzo
Comme déjà dit, RestTemplate est thread-safe.
Mais, pour les tests unitaires, l'utilisation d'une variable statique va vous apporter quelques problèmes pour se moquer de ses appels. Donc, pensez à injecter le RestTemplate en utilisant le constructeur de la classe:
OriginalL'auteur Dherik