Как отобразить текущее состояние Java-приложения по запросу через веб-страницу - PullRequest
0 голосов
/ 11 ноября 2009

У меня очень простое Java-приложение, которое загружает набор валютных курсов из Yahoo! финансирует и выполняет некоторые расчеты по ним. В настоящее время я запускаю это приложение в Eclipse.
Теперь я хотел бы сделать две вещи:
1. Разверните приложение на VPS, чтобы оно могло работать круглосуточно
2. Разработайте консоль управления, чтобы я мог настроить приложение Ex. измените отслеживаемые пары валютных курсов, измените интервал выборки и т. д. и визуализируйте данные.


Я провел некоторые исследования в этой области и думаю, что это должно быть достигнуто с помощью технологий Spring MVC и JSP, JSTL, JChartFree / Google Visualization API.


Что я не могу понять, так это то, как я заставлю приложение работать круглосуточно. Глядя на работу веб-приложений, кажется, что веб-приложение будет обрабатывать запрос и затем завершать работу (хорошо, хорошо). , не выход, а слушать новые запросы). Это не хорошо для меня из-за пункта № 1 выше. Какие методы я могу использовать, чтобы приложение работало 24 x 7 и обслуживало его текущее состояние по требованию?
Спасибо

Ответы [ 5 ]

3 голосов
/ 11 ноября 2009

Вы правы, что это вряд ли будет работать как веб-приложение - обычно они принимают запросы в качестве входных данных и выполняют некоторую обработку для получения HTML-вывода. Не всегда, но это определенно общая структура, в которой они обычно используются, и я не думаю, что ваш конкретный случай слишком хорошо подошел бы для модели.

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

На самом деле кажется, что здесь есть два отдельных компонента:

  1. Само приложение, которое на самом деле не имеет ничего общего с Интернетом и должно запускаться как «обычное» приложение на коробке, вероятно, запускаемое в качестве фонового демона / службы.
  2. Функциональность запроса статуса, которая прослушивает HTTP-запросы и предоставляет относительно простой ответ в зависимости от состояния приложения.

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

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

Наконец, вы можете заставить JMX работать - это та же технология, что и в JConsole, и она позволяет вам определять ваши собственные управляемые bean-компоненты, к которым можно обращаться. Если вы уже определили некоторые MBeans для JConsole, это будет естественным шагом. См. этот документ для примеров того, как написать клиента, который также обращается к этим данным.

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

3 голосов
/ 11 ноября 2009

Создайте веб-приложение и поместите его в веб-контейнер, такой как Tomcat или Jetty. Используйте Spring для создания постоянных процессов (в этом контексте приложения запустит процесс или пул потоков). Используйте JMX для настройки поведения приложения, запуска / остановки его и т. Д. В руководстве Spring есть разделы об интеграции JMX.

1 голос
/ 11 ноября 2009

Запустите его как фоновый запущенный поток, дескриптор которого вы указали в ServletContext (на самом деле: область приложения). ServletContextListener идеально подходит для этого. Э.Г.

public class Config implements ServletContextListener {

    private BackgroundTask backgroundTask = new BackgroundTask(); // Extends Thread.

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("config", this);
        backgroundTask.start();
    }

    public BackgroundTask getBackgroundTask() { 
        return backgroundTask;
    }

}

Чтобы вы могли получить к нему доступ в своих сервлетах следующим образом:

public void doSomething(HttpServletRequest request, HttpServletResponse response) {
    Config config = (Config) getServletContext().getAttribute("config");
    BackgroundTask backgroundTask = config.getBackgroundTask();
    // Now do your thing with it. E.g. backgroundTask.getStatus() ?
}

Конечно, не забудьте установить BackgroundTask в качестве потока демона, чтобы ваш сервер приложений не зависал при завершении работы, потому что он ожидает завершения потока. Вы можете сделать это перед вызовом start() или просто в его конструкторе.

public BackgroundTask() {
    setDaemon(true);
}
1 голос
/ 11 ноября 2009

Я думаю, что вы ищете планировщик работы, как кварц . Вы можете встроить его в свое веб-приложение и заставить выполнять задания без вызова веб-запроса.

0 голосов
/ 11 ноября 2009

Я предполагаю, что ваше приложение должно обслуживать живые данные.

  • на стороне сервера используйте планировщик заданий или другое решение
  • на стороне клиента (веб-браузер) используйте код javascript / ajax для обновления текущих данных

Если вы открыты для использования JSF, вы можете использовать:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...