Использование сервлета для не сервлетного приложения - PullRequest
3 голосов
/ 06 октября 2010

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 06 октября 2010

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

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

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

3 голосов
/ 06 октября 2010

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

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

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

0 голосов
/ 06 октября 2010

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

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

0 голосов
/ 06 октября 2010

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

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

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

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

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