2010-10-06 3 views
3

Я знаю «нормальную» Java, но я новичок в мире сервлетов, контейнеров и т. Д. Из-за этого я не уверен, какой подход наиболее разумен.Использование сервлета для приложения без сервлетов

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

Теперь мне нужно приложение, которое получает точно такую ​​же информацию и сохраняет его в той же базе данных. Однако это новое приложение должно вытащить эту информацию с другого сервера (я буду использовать httpClient для этого) вместо того, чтобы быть нажатой. Оба приложения будут сосуществовать.

Для этого новых приложений, которые я вижу следующие два варианта:

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

  2. Сделать новое приложение частью сервлета. То есть: просто запустите новый поток в init() сервлета, который запустит новое приложение. Это позволило бы мне повторно использовать весь код, который у меня уже есть, без необходимости переписывать его. Мне нужно только написать код, который выполняет HTTP-GET-запросы на другой сервер. При таком подходе также будет проще запустить и остановить службу, потому что для этого я могу использовать контейнер Servlet.

Некоторая информация о проекте: внутренний код, который анализирует и записывает данные в базу данных, имеет несколько потоков, но не очень сложный. Написание кода для исходного сервлета составляло около одной недели работы. С существующей базой кода я считаю, что это новое приложение, вероятно, должно составлять 1, 2 дня работы max.

То, как я вижу, вариант 2 проще. Но мне кажется, что я бы «злоупотреблял» сервлетами. Итак, мой вопрос: не сервлеты для приложений, которые должны обрабатывать запросы, а не приложения, которые делают запрос? Есть ли какие-то огромные недостатки, которые я не вижу здесь? Какой вариант имеет смысл?

tl; dr: Могу ли я написать приложение, которое не обслуживает запросы в качестве сервлета?

ответ

3

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

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

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

+0

Следующий вопрос: я не должен начинать свои собственные темы, иначе произойдут плохие вещи. Не могли бы вы рассказать об этом? В настоящий момент существующие сервлеты используют два фоновых потока для записи данных в две базы данных. Эти потоки подключены к сервлету с помощью BlockingQueue. Причина, по которой я имею это в разных потоках, заключается в том, что запись в базу данных требует много времени (из-за множества триггеров в базе данных), и данные могут поступать в пакеты. Значит, это не советский дизайн? Какая проблема может это дать? – brasilt

+0

Извините, я обновляю ваш комментарий. – Brabster

+0

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

6

Не копировать и вставлять код.

Напишите повторно используемый класс/модуль, который обрабатывает информацию в базе данных, которая может использоваться как 1) сервлетом, так и 2) автономным кодом, который извлекает информацию из HttpClient.

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

0

Вы могли бы использовать, но не должны, это очень плохой дизайн.

Если у вас есть два различных способа доступа к приложению (один через сервлеты и другие, как автономные), вы должны создать в leats три класса:

  • Один класс, который делает всю работу, связанную базу данных и т.д.
  • Один сервлет, который вызывает первый класс
  • Один самостоятельный класс (или любой другой), который вызывает первый класс

Таким образом, вы не копировать/вставить, и вы может повторно использовать ваш код (даже у вас может быть третий способ вызвать класс, который делает тяжелую работу

0

Если вы хотите повторно использовать код, используйте этот код как часть слоя «Служба» или «Бизнес-логика», который будет используется как вашим сервлетом, так и несерлетным приложением.

Упакуйте код как банку и используйте ее в обоих приложениях.

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