Безголовый Java-сервлет? - PullRequest
       12

Безголовый Java-сервлет?

4 голосов
/ 22 марта 2010

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

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

Несколько вопросов:

1) Так как мое приложение не имеет какого-либо HTTP (или другого) механизма запроса / ответа, было бы глупо реализовать сервлет, который не имеет сопоставлений URL? Глядя на API, я бы просто реализовал GenericServlet и просто оставил метод service () пустым?

2) Другая часть моего java-приложения открывает / управляет собственными сетевыми сокетами (не HTTP) для приема потока входящих данных. Я думаю, что потребовалось бы немало усилий, чтобы привести его в соответствие с моделью запроса / ответа сервлета. Это нормально, что сервлет открывает / управляет своими собственными сетевыми сокетами?

3) У нас также есть несколько веб-приложений (в настоящее время в Coldfusion), которые не очень хорошо интегрированы с Java-приложением (в том смысле, что они могут взаимодействовать только через БД). Мы смотрим на Railo (еще один сервлет), и я пытаюсь выяснить, насколько просто было бы для приложений coldfusion / railo (работающих на одном сервере приложений) напрямую взаимодействовать друг с другом. Может быть, веб-страница, которая отображает текущую статистику / метрики времени выполнения java-движка и, в конечном итоге, также вызывает некоторую бизнес-логику в java-движке.

Спасибо, Brian

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Если вы не хотите перехватывать HTTP-запросы, просто не расширяйте HttpServlet. Это не имеет никакого смысла. Если вы действительно хотите выполнить его как «фоновую задачу» при запуске веб-приложения и остановить его при завершении работы веб-приложения, то просто реализуйте ServletContextListener соответственно.

public class Config implements ServletContextListener {

    private YourApp yourApp;

    public void contextInitialized(ServletContextEvent event) {
        yourApp = new YourApp();
        yourApp.start();
    }

    public void contextDestroyed(ServletContextEvent event) {
        yourApp.stop();
    }

}

, который вы можете зарегистрировать в web.xml следующим образом:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

Если YourApp на самом деле не запускает задачу в отдельном потоке, то вам нужно обернуть ее в Runnable и выполнить ее, используя ExecutorService. Э.Г.

public class Config implements ServletContextListener {

    private ExecutorService executor;

    public void contextInitialized(ServletContextEvent event) {
        executor = Executors.newSingleThreadExecutor();
        executor.submit(new YourApp()); // YourApp should implement Runnable.
    }

    public void contextDestroyed(ServletContextEvent event) {
        executor.shutdown();
    }

}

Если, в конце концов, ваше веб-приложение не делает ничего , кроме этого, тогда я подвергаю сомнению ценность его запуска в сервлет-контейнере. Вместо этого просто запустите его как отдельное Java-приложение, используя метод main().

2 голосов
/ 22 марта 2010
  1. Сервлеты - это общий механизм, который не связан конкретно с миром HTTP (несмотря на тот факт, что HttpServlets используются в 99,999% случаев). Вы можете создать подкласс класса Servlet для реализации, скажем, MailServlet, который будет отвечать на почтовые события, но, насколько я знаю, современные веб-серверы поддерживают только сопоставления HTTP.

  2. Сокеты принадлежат миру Java EE, и запускать пользовательские потоки в этой среде считается плохой вещью, и вам, безусловно, нужно будет это сделать, если вы открываете сокеты (для опроса данных и т. Д.)

...