Communication entre deux applications Java distinctes

Je cherche à développer deux applications de bureau Java distinctes (mais liées).

Je veux la possibilité pour une application de déclencher l’autre, en transmettant des données qui peuvent ensuite être modifiées et retransmises, c’est-à-dire que la communication sera à double sens. Si l’autre application est déjà en cours d’exécution, je veux simplement qu’ils communiquent, c’est-à-dire que je ne veux pas simplement passer des arguments sur la ligne de commande, etc.

De manière générale, quelles stratégies / techniques dois-je envisager pour y parvenir?

Pour montrer à quel point il est facile de laisser deux applications communiquer entre elles, jetez un coup d’œil à cette démonstration de réseau-presse à l’aide de JGroups. Il suffit de démarrer deux instances et de commencer à déposer des fichiers dans l’un d’entre eux. La deuxième instance affichera instantanément les mêmes fichiers.

import java.io.Serializable; import java.awt.*; import java.awt.datatransfer.*; import javax.swing.*; import org.jgroups.*; public class JGroupsTest { public static void main(Ssortingng[] args) throws Exception { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setSize(500, 300); final DefaultListModel listModel = new DefaultListModel(); final JList panel = new JList(listModel); panel.setBackground(new Color(128, 0, 40)); panel.setForeground(new Color(240, 240, 240)); frame.add(panel); System.setProperty("java.net.preferIPv4Stack", "true"); final JChannel channel = new JChannel("udp.xml"); channel.connect("networkclipboard"); channel.setReceiver(new ReceiverAdapter() { @Override public void viewAccepted(View newView) { frame.setTitle("Network Clipboard - " + channel.getLocalAddress()); } @Override public void receive(Message msg) { listModel.addElement(msg.getObject()); } }); panel.setTransferHandler(new TransferHandler() { @Override public boolean importData(JComponent comp, Transferable t) { DataFlavor[] transferDataFlavors = t.getTransferDataFlavors(); for (DataFlavor flavor : transferDataFlavors) { try { Object data = t.getTransferData(flavor); if (data instanceof Serializable) { Serializable serializable = (Serializable) data; Message msg = new Message(); msg.setObject(serializable); channel.send(msg); } } catch (Exception e) { e.printStackTrace(); } } return super.importData(comp, t); } @Override public boolean canImport(TransferSupport support) { return true; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { return true; } }); } } 

Cela dépend comment voulez-vous communiquer ces 2 programmes:

  • Si vous n’avez besoin que de sémaphores inter-processus, créez un fichier quelque part dans / tmp et verrouillez-le.

  • Si vous n’avez besoin que de la messagerie synchrone inter-processus (appel de procédure à distance), RMI devrait être plus facile.

  • Si vous avez besoin d’une messagerie interprocessus asynchrone, JMS devrait être plus facile.

  • Si vous avez besoin d’une mémoire partagée inter-processus, utilisez des fichiers mappés.

  • Si vous avez besoin de tout ce qui précède, Terracotta (http://www.terracotta.org/) est le moyen le plus simple: les programmes Java sur différentes machines virtuelles Java sur des ordinateurs identiques ou différents se voient comme s’ils étaient exécutés dans une machine virtuelle Java unique. machine. Diviser un programme en plusieurs ne nécessite même aucun changement de code – il suffit d’écrire un fichier de configuration XML.

Ils pouvaient chacun écouter sur un Socket . Ce tutoriel est bon pour commencer.

Vous devriez également considérer le bon vieux RMI classique.

Jetez un coup d’œil à JavaGroups , cela résoudra votre problème de communication et vous aidera également à détecter si l’autre application est en cours d’exécution. Si l’application n’est pas en cours d’exécution, vous devrez lancer une nouvelle JVM avec java.lang.Runtime.exec () …

Essayez de communiquer avec SocketCommunication, même si l’application est dans le même ordinateur.

Vous trouverez ici plus d’informations sur la procédure à suivre (documentation Sun / Java).

  • La méthode “Enterprise” consiste à exécuter ces applications sur un serveur Java EE ou au moins dans une infrastructure Spring. C’est probablement aussi excessivement exagéré.

  • Si un dataset doit être communiqué, RMI le fera.

  • Si vous n’avez pas peur de pirater votre propre protocole, structure de données et gestion des erreurs, vous pouvez configurer les sockets serveur et client et communiquer via ceux-ci.

  • Je pense qu’il y a un certain appel à l’alternative de communiquer via un fichier dans un répertoire commun (configurer votre propre protocole pour savoir qui écrit ou efface le fichier quand), ou via une firebase database partagée. Basse technologie, pas extrêmement rapide, mais très simple et fiable. Et il est assez facile de surveiller la “communication” de l’extérieur.

Pour garder les choses simples, pourquoi ne pas simplement utiliser des sockets TCP simples?

Je seconde communication Socket et RMI. RMI est un peu plus impliqué mais est plus intuitif pour un programmeur. Cela dépend du type d’informations que vous envoyez. Pousser des octets bruts sur une autre machine peut avoir plus de sens que de lancer le serveur RMI et de gérer tout ce que le jazz …

Cela dépend du type de communication que vous voulez faire entre les 2 applications. Si vous utilisez des sockets ou RMI, par exemple, les deux applications doivent être activées pour que la communication se produise. Si le type de communication que vous souhaitez effectuer peut être plus asynchrone, vous pouvez utiliser une approche basée sur la messagerie.

Par exemple, ZooKeeper vous permet d’implémenter à peu près tout ce que vous voulez sur des primitives très simples mais puissantes. Cette page ( http://hadoop.apache.org/zookeeper/docs/current/recipes.html ) explique comment créer des constructions de niveau supérieur avec ZooKeeper.

L’inconvénient est que vous avez besoin d’un autre système. Si vous utilisez JGroups par exemple, alors vous ne le faites pas.

J’espère que cela t’aides

Selon le type de communication que vous recherchez (latence élevée, beaucoup de données, etc.) et selon que ce système peut ou non dépasser 2 systèmes Java, une solution pourrait être un système de messagerie utilisant une solution de middleware telle que Tibco. SmartSockets.

Toute information supplémentaire sur votre configuration et vos attentes serait utile.