Comment avoir 2 JVM parler les uns aux autres

, j'ai la situation suivante:

J'ai 2 Processus JVM (en fait 2 Processus java s'exécutant séparément, pas 2 threads) s'exécutant sur une machine locale. Appelons - ProcessA un ProcessB.

Je veux qu'ils communiquent (échangent des données) entre eux (par exemple, ProcessA envoie un message à ProcessB pour faire quelque chose).

Maintenant, je travaille autour de ce problème en écrivant un fichier temporaire et ces processus analysent périodiquement ce fichier pour obtenir un message. Je pense que cette solution ne l'est pas Bien.

Quelle serait une meilleure alternative pour réaliser ce que je veux?

50
demandé sur haylem 2012-06-08 06:39:02

6 réponses

Multiples options de CIB:

Réseau Basé Sur Socket (Bare-Bones)

  • pas nécessairement dur, mais:
    • pourrait être verbeux pour pas beaucoup,
    • pourrait offrir plus de surface pour les bogues, car vous écrivez Plus de code.
  • , vous pouvez compter sur les cadres existants, comme Netty

RMI

  • techniquement, c'est aussi la communication réseau, mais c'est transparent pour vous.

Architectures de transmission de messages à part entière

  • généralement construit sur les communications RMI ou réseau ainsi, mais avec la prise en charge des conversations compliquées et des flux de travail
  • peut-être trop lourd pour quelque chose de simple
  • cadres comme ActiveMQ ou JBoss Messaging

Extensions de gestion Java (JMX)

  • plus conçu pour JVM de gestion et de suivi de, mais pourrait aider à implémentez ce que vous voulez si vous voulez surtout qu'un processus en demande un autre pour les données, ou lui envoie une demande d'action, si elles ne sont pas trop complexes
  • fonctionne également sur RMI (entre autres protocoles possibles)
  • pas si simple à envelopper votre tête au début, mais en fait plutôt simple à utiliser

Partage de fichiers / verrouillage de fichiers

  • c'est ce que vous faites en ce moment
  • c'est faisable, mais il y a beaucoup de problèmes à poignée

Signaux

  • vous pouvez simplement envoyer des signaux à votre autre projet
  • cependant, c'est assez limité et vous oblige à implémenter une couche de traduction (c'est faisable, mais une idée plutôt folle à jouer avec que tout ce qui est sérieux.

Sans plus de détails, une approche IPC basée sur un réseau à os nu semble la meilleure, car c'est la:

  • la plus extensible (en termes d'ajout de nouvelles fonctionnalités et votre
  • plus léger (en termes d'empreinte mémoire pour votre application)
  • plus simple (en termes de conception)
  • le plus éducatif (en termes d'apprentissage de la mise en œuvre de la CIB). (comme vous l'avez mentionné "socket est dur" dans un commentaire, et ce n'est vraiment pas et devrait être quelque chose sur lequel vous travaillez)

Cela étant dit, en fonction de votre exemple (en demandant simplement à l'autre processus de faire une action), JMX pourrait également être assez bon pour vous.

68
répondu haylem 2016-04-26 17:16:45

J'ai ajouté une bibliothèque sur github appelée Mappedbus ( http://github.com/caplogic/mappedbus ) qui permettent à deux (ou beaucoup plus) processus Java / JVM de communiquer en échangeant des messages. La bibliothèque utilise un fichier mappé en mémoire et utilise fetch-and-add et volatile read / writes pour synchroniser les différents lecteurs et écrivains. J'ai mesuré le débit entre deux processus utilisant cette bibliothèque à 40 millions de messages / s avec une latence moyenne de 25 ns pour lire / Écrire un seul message.

16
répondu MikaelJ 2015-06-04 16:30:46

Ce que vous cherchez est de inter-process communication. Java fournit un cadre IPC simple sous la forme de Java RMI API . Il existe plusieurs autres mécanismes de communication inter-processus tels que les tuyaux, les sockets, les files d'attente de messages (ce sont tous des concepts, évidemment, donc il y a des frameworks qui les implémentent).

Je pense que dans votre cas Java RMI ou une simple implémentation de socket personnalisée devrait suffire.

5
répondu Strelok 2012-06-08 02:45:49

Sockets avec flux DataInput(Output), pour envoyer des objets java d'avant en arrière. C'est plus facile que d'utiliser un fichier disque, et beaucoup plus facile que Netty.

3
répondu Alexei Kaigorodov 2012-06-08 05:07:54

J'ai tendance à utiliser jGroup pour former des clusters locaux entre les processus. Cela fonctionne pour les nœuds (processus aka) sur la même machine, dans la même JVM ou même sur différents serveurs.

Une fois que vous comprenez les bases, il est facile de travailler avec et d'avoir les options pour exécuter deux processus ou plus dans la même JVM, il est facile de tester ces processus facilement.

La surcharge et la latence sont minimes si les deux sont sur la même machine (généralement seulement un rountrip TCP d'environ > 100ns par action).

2
répondu Martin Kersten 2015-04-30 09:30:39

Socket peut être un meilleur choix, je pense.

0
répondu Marcus 2012-06-08 02:42:11