Подтвердить что ты не робот

Запуск Java на веб-сервере

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

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

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

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

Это плохо?

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

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

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


Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Да.

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

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

Ответ 3

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

Предполагая, что вам нужно сохранить свой сайт на 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 или обычный текст.

Ответ 4

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

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

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

Ответ 5

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