2013-02-08 9 views
0

J'ai 2 questions générales ici:


Tout d'abord, dire que j'ai 2 programmes java en cours d'exécution. Presque comme un répondeur et un exécuteur testamentaire.Communication entre les programmes

L'exécuteur peut émettre des commandes, des requêtes et des messages du répondeur. Je sais qu'il est possible de les avoir tous les deux empaquetés en un seul programme grâce au multi-threading, mais forcément il n'y aura peut-être pas qu'un seul répondeur, il pourrait y en avoir trois, peut-être même 0 répondeurs.

Quelle est la meilleure façon pour les 2 programmes de «communiquer» comme un flux, ce qui implique que je n'ai pas accès aux autres adaptateurs?


La deuxième question:

est-il un moyen de vérifier si un programme Java est déjà ouvert? Donc, si je cours un programme, je ne peux pas l'exécuter une seconde fois si le premier est toujours en cours d'exécution.

Merci

+0

Sur les systèmes * nix, vous avez des canaux nommés, qui pourraient probablement être utilisés comme flux dans Java. –

Répondre

2
  1. Vous devez coder explicitement une solution basée sur les sockets. Aujourd'hui, je suppose que REST serait le choix le plus évident. Une solution plus lourde serait quelque chose basée sur JMS (impliquant une file d'attente de messages autonome, également basée sur la base de données).

  2. Oui, il y a un moyen, mais rien d'original. Cela implique généralement la création de fichiers temporaires dont l'existence est vérifiée. Il existe quelques méthodes pratiques, comme createTemporaryFile et deleteOnExit qui prennent en charge le travail de bas niveau.

2

Vous devez choisir le niveau de communication entre les programmes. En Java, le niveau de communication le plus bas serait via l'API Socket. En plus de cela, il y a un tas d'autres protocoles implémentés: RMI, Corba, divers services Web, etc.

Afin de garantir 1 instance en cours d'exécution, vous devez vous appuyer sur quelque chose en dehors de cette instance. Je peux penser à:

  • Fichier externe créé en exécutant l'application.
  • Enregistrement de base de données produit en exécutant l'application.
  • Port ouvert par votre application en cours d'exécution.
0

La réponse à la fois de votre question peut être en utilisant les sockets

1- Pour la communication, une application client multi-thread/serveur peut être une bonne solution

2- Pour vérifier si le programme est déjà en cours d'exécution, comme une solution de contournement (à côté de l'utilisation de fichiers), vous pouvez écouter un certain port, donc si une autre instance du programme a échoué à écouter ce port, cela signifie que le programme est déjà en cours d'exécution.

Vous pouvez stocker le port que vous écoutez dans un fichier, au lieu de le coder en dur, pour éviter tout conflit possible avec d'autres applications qui pourraient utiliser le même port par hasard.