J'ai la situation suivante:
J'ai 2 processus JVM (vraiment 2 Java
processus fonctionnant séparément, pas 2 threads) fonctionnant sur une machine locale. Appelons-les ProcessA
an 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 contourne ce problème en écrivant un fichier temporaire et ces processus analysent régulièrement ce fichier pour obtenir un message. Je pense que cette solution n'est pas si bonne.
Quelle serait une meilleure alternative pour réaliser ce que je veux?
Plusieurs options pour IPC :
Sans plus de détails, une approche réseau à nu IPC semble la meilleure, car c'est la:
Cela étant dit, sur la base de votre exemple (simplement demander à l'autre processus de faire une action), JMX pourrait également être assez bon pour vous.
J'ai ajouté une bibliothèque sur github appelée Mappedbus ( http://github.com/caplogic/mappedbus ) qui permet deux (ou beaucoup plus) Java processus/JVM pour communiquer en échangeant des messages. La bibliothèque utilise un fichier mappé en mémoire et utilise des fonctions de lecture-écriture et de lecture/écriture volatiles 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.
Ce que vous recherchez est inter-process communication
. Java fournit un cadre simple IPC sous la forme Java RMI API . Il existe plusieurs autres mécanismes de communication inter-processus tels que comme des tuyaux, des sockets, des files d'attente de messages (ce sont tous des concepts, évidemment, donc il y a des cadres qui les implémentent).
Je pense que dans votre cas Java RMI ou une simple implémentation de socket personnalisé devrait suffire.
Sockets avec DataInput (Output) Stream, pour envoyer des objets Java dans les deux sens. C'est plus facile que d'utiliser un fichier disque, et beaucoup plus facile que Netty.
J'ai tendance à utiliser jGroup pour former des grappes locales entre les processus. Il fonctionne pour les nœuds (ou processus) sur la même machine, au sein de la même machine virtuelle Java 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 réellement 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 TCP rountrip d'environ> 100 ns par action).
la prise peut être un meilleur choix, je pense.
En 2004, j'implémente du code qui fait le travail avec les sockets. D'ici là, je recherche souvent une meilleure solution, car l'approche socket déclenche le pare-feu et mes clients s'inquiètent. Il n'y a pas de meilleure solution jusqu'à présent. Le client doit sérialiser vos données, envoyer et le serveur doit recevoir et désérialiser. C'est facile.