Джаластическая связь между узлами

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

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

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

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

Мои вопросы:

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

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

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 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
}
Другие вопросы по тегам