2016-05-22 5 views
0

У меня есть программа perl, которая динамически генерирует изображения на основе заданной ширины. Мне нужно создать веб-сервис, который принимает размеры изображения от клиента и передать его в программу perl, чтобы создать изображение, а затем отправить его обратно клиенту.Jelastic commincation между узлами

Hope this image helps to understand

Сейчас на Jelastic облаке, я создал 3 узла:

  • Узел 1: для кота (содержит код Java).
  • Узел 2: для MySql (содержит базу данных).
  • Узел 3: для Centos VPS (содержит код perl).

Мои вопросы:

  1. Я делаю правильные вещи ?? если не лучший способ сделать мою программу?

  2. Как я могу вызвать код perl (в узле 3) из службы java (в узле 1) и вернуть сгенерированное изображение обратно клиенту.

ответ

3

Звучит разумно. Ты бы написал что-то вроде этого.

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

Конечно, вы должны настроить /usr/bin/perl туда, где ваш собственный Perl exeutable на самом деле, или вы могли бы вызвать оболочку, чтобы заставить ее искать путь, используя

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

Что касается как чтобы вернуть изображение клиенту, вы не говорите много о том, как работает ваша программа Perl, но либо вы скажете, где писать файл, либо он сам решает, и сообщает вам, где он был помещен позже.

Если это первый, тогда вы, вероятно, пройдете путь в командной строке, так что вам просто нужно расширить вызов на runt.exec выше, чтобы передать другой параметр

Если это последний, то, предположительно, программа печатает в 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. Они действуют как два разных компьютера, «если я прав». Поэтому я не могу использовать ваш метод для вызова программы perl, если они не находятся в одном узле. – Ahmedy