2009-03-24 5 views
6

J'ai écrit un serveur Thrift en Java pour tirer parti d'un paquet/bibliothèque Java spécifique, mais je ne suis pas un programmeur java.Préchargement de classes/bibliothèques java au démarrage de jar?

Le problème est; Je vois un délai d'attente pour le premier appel RPC au serveur. Les demandes de sous-requête sont exécutées sans aucun problème et affectent uniquement les clients écrits dans certaines langues (mais essentielles). Mon idée actuelle est que le serveur expire sur la réponse parce que, lors du premier appel, il doit charger toutes les bibliothèques requises pour la requête. Certaines implémentations client Thrift doivent gérer le délai d'attente mieux que d'autres, en gardant éventuellement la demande ouverte un peu plus longtemps.

Existe-t-il un moyen de précharger les bibliothèques que j'utilise lorsque je lance le fichier .jar pour qu'il n'y ait pas de retard sur la première requête?

Solution: J'ai contourné le problème (et d'autres problèmes ont été soulevés) en augmentant le délai d'attente du ou des clients de friperie. Cependant, j'ai implémenté la réponse static/Class.forName aussi pour aider les choses, ce qui fonctionne très bien. Merci!

+0

Vous pouvez jeter un oeil à certains [préchargement de classe Java] existant (https://github.com/jermainexu/ClassPreloader). – StarPinkER

Répondre

3

Vous pouvez exécuter une charge avant que le serveur ne devienne actif. Vous n'avez pas spécifié comment vous chargez le serveur, les classes et l'environnement, mais vous pouvez tirer parti du fait qu'un initialiseur statique de classe s'exécutera lorsque la classe est chargée. Donc, si vous utilisez une méthode de « principale », votre classe pourrait ressembler à ceci

public class Foo { 

    static { 
    //this will be run when the class is loaded 
    try { Class.forName("fully.qualified.class.name.that.i.want.to.Load"); } 
    catch ... 
    } 

    public static void main (string args[]) 
    { 
    //run my server... 
    } 
} 
+0

Cette solution est plutôt fragile. Une meilleure solution est de faire une action fictive avant la main qui chargera toutes les classes nécessaires. Quelque chose comme 'sendRequest ("/dev/null ")' serait bien. Mais l'idée de base est d'accord. –

2

Une chose que vous pourriez vouloir essayer est d'écrire un client simple à l'intérieur du serveur Java lui-même. Ce client ne fait rien d'autre que d'appeler une méthode dans le serveur au démarrage, forçant le chargement des classes. Après que ce petit client obtienne un résultat (ou un rappel), il place le serveur dans un état "accessible par le monde extérieur".

0

Je suggère de simuler une connexion juste avant d'ouvrir le serveur. Cela garantira que l'initialisation paresseuse (la plus) pertinente aura été effectuée.

Questions connexes