2016-05-22 2 views
0

私は、与えられた幅に基づいて画像を動的に生成するperlプログラムを持っています。私は、クライアントからイメージの次元を取り、それをperlプログラムに渡してイメージを作成し、それをクライアントに返すWebサービスを作成する必要があります。ノード間のJelastic communincation

  • ノード1:Tomcatの(Javaコードが含まれています)

    Hope this image helps to understand

    は今Jelasticクラウド上、私は3つのノードを作成しました。
  • ノード2:MySql(データベースを含む)用。
  • ノード3:CentOS VPS用(perlコードを含む)。

私の質問は:

  1. は、私は私は正しいことをやっています?私のプログラムを行う最良の方法は何ですか?

  2. (ノード1の)Javaサービスから(ノード3の)perlコードを呼び出し、生成されたイメージをクライアントに返すことができます。

答えて

3

妥当なデザインです。あなたはこのようなものを書くでしょう。あなたがあなた自身のperl exeutableが実際にある場所に/usr/bin/perlを調整する必要があります、またはあなたはそれがどのようにについては

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

を使用してパスを検索するために取得するためにシェルを呼び出すことができます。もちろん、

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(); 
} 

イメージをクライアントに戻すには、Perlプログラムの動作についてはあまり言いませんが、ファイルを書き込む場所を指定するか、それ自体を決定して後でどこに置くかを教えてください。

Ifそれは前者です、あなたはおそらくパスを渡しますコマンドラインで別のパラメータを渡すために上記のへの呼び出しを延長するだけです

もしそれが後者なら、おそらくプログラムは新しいファイルを置いたSTDOUTに出力します。あなたのJavaコードからストリームを取得して情報を収集します。それはproc.waitFor()コール

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

あなたのソリューションは、私はすべての環境が同じノード(tomcatに、perlの)にインストールされている場合にのみ、良いと思われるの代わりにこのようになります。 – Ahmedy

+0

jelasticでは、tomcatノードはcentosノードとは別です。彼らは2つの異なるPCのように振る舞います。ですから、同じノードにない限り、あなたのメソッドを使ってperlプログラムを呼び出すことはできません。 – Ahmedy

関連する問題