Упругое общение между узлами

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

Надеюсь, это изображение поможет понять

Теперь в облаке Jelastic я создал 3 узла:

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

Мои вопросы:

  1. Я правильно делаю ?? если нет, то как лучше всего делать мою программу?

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


person Ahmedy    schedule 22.05.2016    source источник


Ответы (1)


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

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, или вы можете вызвать оболочку, чтобы заставить ее искать путь, используя

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
}
person Borodin    schedule 22.05.2016
comment
ваше решение кажется хорошим, только если у меня все среды установлены на одном узле (tomcat, perl). - person Ahmedy; 25.05.2016
comment
В jelastic узел tomcat отделен от узла centos. Если я прав, они действуют как два разных компьютера. Поэтому я не могу использовать ваш метод для вызова программы Perl, если они не находятся в одном узле. - person Ahmedy; 25.05.2016
comment
@Ahmedy, вы можете выполнить сценарий perl на том же узле tomcat. Уточните, пожалуйста, причину, по которой вы поместили его в отдельный узел VPS, возможно, отсутствуют какие-то библиотеки? - person Ruslan; 14.03.2019