2010-03-22 2 views
4

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

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

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

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

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

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

Спасибо, Brian

ответ

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

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

+0

У меня определенно есть куча потоков, которые я запускаю/управляю. Неужели так плохо, что у сервлета возникают потоки? Я читал, что он должен быть потокобезопасным, но ничего не видел о нерестах нитей. – Brian

+1

@Brian - это обычно нахмуренная практика; потому что плохо управляемый поток, запущенный вашим сервлетом, может помешать контейнеру/серверу сервлета отвечать на команды выключения. Посмотрите на использование инфраструктуры Executor. –

+2

@Brian - Почему нерестовые нити считаются плохими -> http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847. В вашем случае это будет отрицать ваши рассуждения об управляемости, поскольку вы делаете то, что контейнер не может управлять. – Robin

2

Если вы не хотите перехватывать HTTP-запросы, просто не расширяйте HttpServlet. Это не имеет никакого смысла. Если вы действительно хотите выполнить его как «фоновое задание» при запуске webapp и остановить его при завершении работы webapp, тогда просто установите 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(); 
    } 

} 

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

+0

Он работает автономно через main(). Я уклоняюсь от сервера приложений, потому что: 1) управляемость (особенно если мы можем запускать его вместе с остальными нашими веб-приложениями, 2) позволяя нашим Webapps интегрироваться с движком (вопрос №3 в моем исходном сообщении) 3) long долгосрочный: подвергая часть своих внутренних услуг веб-сервисам. – Brian

+0

также, как службы приложений отображаются на серверах приложений? Как служба планировщика в Coldfusion/Railo? Используют ли они механизм ServletContextListener? – Brian

+0

Тогда просто используйте подход «ServletContextListener», вам нужно будет только обернуть его в «Runnable». Я не делаю Coldfusion/Railo, но могу себе представить, что они делают подобное. Else просто сканирует в своем документе/исходном коде, чтобы быть уверенным. – BalusC

Смежные вопросы