2016-05-22 2 views
0

J'ai un programme perl qui génère dynamiquement des images basées sur la largeur donnée. J'ai besoin de créer un service web qui prend des dimensions d'image du client, et le passe au programme perl pour créer l'image puis le renvoyer au client.Communication de Jelastic entre les noeuds

Hope this image helps to understand

maintenant le nuage Jelastic, je créé 3 nœuds:

  • noeud 1: pour tomcat (contient le code Java).
  • Noeud 2: pour MySql (contient la base de données).
  • Noeud 3: pour Centos VPS (contient le code perl).

Mes questions:

  1. Je suis-je faire la bonne chose ?? sinon quelle est la meilleure façon de faire mon programme? Comment puis-je appeler le code Perl (dans le nœud 3) à partir du service Java (dans le nœud 1), et renvoyer l'image générée au client.

Répondre

3

Cela semble raisonnable. Tu écrirais quelque chose comme ça.

import java.lang.Runtime; 

int width = 99; 

try { 
    Runtime runt = Runtime.getRuntime() 
    Process proc = runt.exec('/usr/bin/perl', '/path/to/myperl.pl', Integer.toString(width)); 
    proc.waitFor(); 
} 
catch (Exception ioe) { 
    ioe.printStackTrace(); 
} 

Bien sûr, vous devrez régler /usr/bin/perl où votre propre perl exeutable est vraiment, ou vous pouvez appeler le shell pour l'obtenir pour rechercher le chemin en utilisant

runt.exec('/bin/bash', '-c', 'perl', '/path/to/myperl.pl', Integer.toString(width)); 

Quant à la façon pour renvoyer l'image au client, vous ne dites pas grand-chose sur le fonctionnement de votre programme Perl, mais soit vous lui dites où écrire le fichier, soit il décide par lui-même et vous indique où il l'a mis par la suite

Si c'est le premier, alors tu devrais probablement passer le chemin sur la ligne de commande, il vous suffit d'étendre l'appel à runt.exec ci-dessus pour passer un autre paramètre

Si c'est le dernier, alors probablement le programme imprime à STDOUT où il a mis le nouveau fichier, et vous devez lire cela diffuser à partir de votre code Java pour collecter les informations. Cela ressemblerait à ceci en place du proc.waitFor() appel

import java.io.*; 

BufferedReader inp = new BufferedReader(
    new InputStreamReader(proc.getInputStream()) 
); 

while ((line = inp.readLine()) != null) { 
    // Process output of Perl code to get file location 
} 
+0

votre solution semble bien que si je tous les environnements sont installés sur le même noeud (tomcat, perl). – Ahmedy

+0

En jelastic, le nœud tomcat est séparé du nœud centos. Ils agissent comme deux PC différents "si j'ai raison". Donc je ne peux pas utiliser votre méthode pour appeler le programme Perl à moins qu'ils ne soient dans le même nœud. – Ahmedy