Запуск Java на веб-сервере - PullRequest
11 голосов
/ 09 марта 2009

Я написал отдельное Java-приложение, которое я упаковал в jar-файл, который принимает некоторые аргументы командной строки, выполняет некоторые жесткие вычисления, а затем записывает результат в файл вместе с некоторым выводом в поток вывода по умолчанию. указывая, где находится файл с результатами.

Теперь я хочу создать сайт на основе этой технологии. Идея состоит в том, что пользователь может заполнить HTML-форму, опубликовать ее на веб-странице, которая затем вызовет приложение Java, проанализировать результаты из приложения Java и отобразить ее пользователю.

В настоящее время я использую немного PHP для сбора данных из почтового запроса, а затем просто использую вызов exec:

java -jar -Xmx128m myapplication.jar command-line-arguments

Это плохо?

У меня есть несколько тысяч посещений моего сайта каждый день, и каждое выполнение Java-приложения может занимать от 30 секунд до минуты, поэтому я не хочу быть чрезмерно неэффективным. Похоже, что было бы лучшее решение, чем прямой вызов Java для каждого запроса.

Я продолжаю слышать такие вещи, как ява-сервлеты, бобы, кот, стеклянная рыба и т. Д., Но я не понимаю, что это такое и как они могут мне помочь. Что это мне дает? Более быстрые результаты, потому что Java JVM не нужно создавать каждый раз, когда я запускаю приложение? Меньше использования памяти? Я, очевидно, хочу, чтобы он работал максимально быстро и занимал как можно меньше памяти.

Итак, какой лучший подход я могу использовать здесь? Я не хочу делать каких-либо серьезных переписываний для моего приложения, так как кода много (поэтому переписать его на C или C ++ не может быть и речи).


Спасибо.

Ответы [ 5 ]

12 голосов
/ 09 марта 2009

Хорошо, сервлеты - это небольшие приложения, которые предназначены для работы внутри контейнера. Они предоставляют вам точку расширения для вставки кода Java в простой контейнер сервлетов, такой как tomcat, или в более полнофункциональный сервер приложений, такой как glassfish. Вы хотите сделать это, потому что сервер приложений выполняет тяжелую работу по взаимодействию с http и предоставляет другие функции, такие как безопасность, ведение журнала, управление сеансами, обработка ошибок и многое другое (см. спецификацию сервлета ).

Когда вы делаете ваше приложение живым в рамках приложения (веб-сервер со всеми этими дополнительными функциями), вы также можете лучше управлять жизненным циклом своего приложения. Вы сможете запускать и останавливать приложение без выключения веб-сервера, повторного развертывания, запуска большего количества экземпляров и т. Д. Кроме того, когда вы создаете это прекрасное второе приложение, его легко вставить прямо рядом с первым. , Или вы можете объединить несколько машин в кластер для упрощения резервирования и распределения нагрузки, а также функций сервера приложений.

Это только начало, есть много других функций, технологий и структур, которые помогут вам создавать приложения на основе контейнеров. Учебник по сервлету .

2 голосов
/ 09 марта 2009

Запустите ваш код внутри контейнера сервлета.

Предполагая, что вам нужно поддерживать свой веб-сайт на PHP и, поскольку на вашем компьютере уже установлена ​​Java, просто установите бесплатный контейнер сервлета (такой как Apache Tomcat или Jetty). Настройте для запуска контейнера сервлета на неиспользуемый порт. (8080) по умолчанию.

Эти контейнеры сервлетов на самом деле являются веб-серверами на основе Java, как и Apache, однако специализируются на обслуживании кода Java.

Наиболее очевидным преимуществом использования веб-сервера java вместо нового вызова java.exe для каждого запроса является то, что виртуальная машина java (jvm) всегда будет «горячей», работающей и работающей. Каждый новый запуск java.exe (jvm) будет давать вам лишние секунды.

Вторым преимуществом использования контейнера сервлета является то, что контейнер позволит вашему коду запускаться в новом потоке внутри jvm для каждого нового запроса. У вас не будет проблем с предоставлением ваших услуг тысячам пользователей в день. Скорее всего, ваша машина выйдет из строя, если вы запустите сотни экземпляров Java, а не один.

Поместите свой код в сервлет. Это действительно легко даже для новичка. Вы будете общаться с сервлетом по HTTP (методы сервлета doGet или doPost). Передайте форму запроса php этому сервлету и попросите сервлет вернуть вам все, что угодно: страницу, объект json, xml или простой текст.

2 голосов
/ 09 марта 2009

[Получают ли они меня] "Более быстрые результаты, потому что Java JVM не нужно создавать каждый раз, когда я запускаю приложение?"

Да.

И - бонус - вы можете заменить PHP, чтобы весь ваш сайт был на одном языке: Java.

Кроме того, вы можете рассмотреть возможность пересмотра вариантов использования, чтобы не было болезненных 30-60 секунд за один выстрел, а, возможно, была серия быстрых шагов, выполняемых в интерактивном режиме с пользователем.

0 голосов
/ 09 марта 2009

Для начала проще всего встроить веб-сервер в ваше приложение. Посмотрите на Причал .

0 голосов
/ 09 марта 2009

Вы, вероятно, не хотите вызывать Java-приложение непосредственно с веб-сайта. Как вы сказали, если запуск процесса java займет 30 секунд, ваш веб-сервер будет сильно зависать, особенно если ваш сайт набирает обороты.

Возможно, вы захотите заглянуть в веб-сервисы (и, возможно, в очередь сообщений) для отправки запросов на внутреннюю обработку. Страница PHP может вызывать веб-сервис на сервере, который затем может поместить запрос на обработку в очередь, или просто запустить приложение Java в асинхронном режиме. Вы не хотите, чтобы HTTP-запрос ожидал завершения работы java-приложения, потому что во время его обработки у пользователя просто будет зависший браузер, а HTTP-запрос может быть остановлен.

После завершения работы java-приложения оно может обновить таблицу базы данных, к которой пользователь может получить доступ с веб-сайта.

...