Communication entre les JVM locales

ma question: quelle approche pourrais-je/devrais-je adopter pour communiquer entre deux ou plusieurs instances JVM qui fonctionnent localement?

une description du problème:

Je suis en train de développer un système pour un projet qui nécessite des instances JVM distinctes pour isoler complètement certaines tâches les unes des autres.

dans son exécution, la JVM "mère" créera des JVM "enfants" qu'elle s'attendra à exécuter, puis lui retournera les résultats (en le format des classes POJO relativement simples, ou peut-être des données XML structurées). Ces résultats ne doivent pas être transférés en utilisant les pipes SysErr/SysOut/SysIn car l'enfant peut déjà les utiliser dans le cadre de son fonctionnement.

si un JVM enfant ne répond pas avec des résultats dans un certain délai, le JVM parent devrait être en mesure de signaler à l'enfant de cesser le traitement, ou de tuer le processus enfant. Dans le cas contraire, l'entreprise commune enfant devrait sortir normalement à la fin de la réalisation de son projet. tâche.

Recherche:

Je suis conscient qu'il existe un certain nombre de technologies qui peuvent être utiles, par exemple:...

  • utilisation de la bibliothèque RMI de Java
  • utilisation de sockets pour transférer des objets
  • en utilisant des bibliothèques de distribution telles que Cajo, Hessian

...mais je suis intéressé à entendre quelles approches les autres peuvent envisager avant de poursuivre l'une de ces options, ou d'autres.

Merci pour tout de l'aide ou des conseils sur ce!

Modifications:

Quantité de données à transférer- relativement petit, il ne sera généralement qu'une poignée de POJOs contenant des cordes qui représenteront le résultat de l'exécution de l'enfant. Si aucune solution serait inefficace sur de plus grandes quantités d'informations, c'est peu probable problème dans mon système. La quantité transférée devrait être assez statique et donc cela fait être évolutif.

latence of transfer - pas une préoccupation critique dans ce cas, bien que si un "sondage" des résultats est nécessaire, cela devrait pouvoir être assez fréquent sans frais généraux significatifs, de sorte que je puisse maintenir une interface graphique réactive en plus de cela à un moment ultérieur (par ex. barre de progression)

24
demandé sur obfuscation 2011-02-19 19:48:45

11 réponses

j'utilise KryoNet avec des sockets locaux car il est très spécialisé dans la sérialisation et est assez léger (vous obtenez aussi L'Invocation de méthode À Distance! Je l'utilise en ce moment), mais désactivez le délai de déconnexion de la prise.

RMI fonctionne essentiellement sur le principe que vous avez un type distant et que le type distant implémente une interface. Cette interface est partagée. Sur votre machine locale, vous liez l'interface via la bibliothèque RMI au code "injecté" en mémoire de la bibliothèque RMI, le résultat est que vous avez quelque chose qui satisfait l'interface mais qui est capable de communiquer avec l'objet distant.

5
répondu Chris Dennett 2011-02-19 18:03:17

pas directement une réponse à votre question, mais une suggestion d'alternative. Avez-vous envisagé d' OSGI?

il vous permet d'exécuter des projets java complètement isolés les uns des autres, au sein de la même jvm. La beauté de cela est que la communication entre les projets est très facile avec les services (voir spécifications de base PDF page 123). De cette façon, il n'y a pas de "sérialisation" de quelque sorte fait que les données et les appels sont tous dans le même jvm.

en outre toutes vos exigences de qualité de service (temps de réponse etc...) d'aller plus loin - vous que vous avez seulement à vous soucier de savoir si le service est HAUT ou vers le BAS au moment où vous souhaitez l'utiliser. Et pour cela vous avez une spécification vraiment agréable qui fait cela pour vous appelé des Services déclaratifs (voir Enterprise Spec PDF page 141)

Désolé pour la réponse hors sujet, mais j'ai pensé que certains d'autres personnes pourraient considérer cela comme une alternative.

mise à Jour

pour répondre à votre question sur la sécurité, je n'ai jamais envisagé un tel scénario. Je ne crois pas qu'il y ait un moyen d'imposer L'usage de la "mémoire" au sein D'OSGI.

Enterprise Spec PDF