#java #hibernate #integration
#java #переход в спящий режим #интеграция
Вопрос:
В моем веб-приложении у меня есть часть, которая должна непрерывно сканировать Веб, обрабатывать эти данные и представлять их пользователю. Итак, мне было интересно, хороший ли это подход — разделить его на два отдельных приложения, где можно было бы выполнять обход, обработку данных и хранить данные в базе данных. А другим приложением было бы веб-приложение (смонтированное на каком-либо веб-сервере), которое представляло бы пользователю данные из базы данных и позволяло бы ему определенное взаимодействие с данными.
Причина, по которой я думаю, что мне нужно это разделение, заключается в том, что если я внесу определенные изменения в свое веб-приложение (например, добавлю новые функциональные возможности, изменю интерфейс и т.д.) Я бы не хотел, чтобы сканирование прерывалось.
Мой стек приложений — это Tapestry (веб-уровень), Spring, Hibernate (поверх MySQL) и моя собственная реализация сканера, независимая от других.
Хорошо ли, чтобы интеграция выполнялась только с использованием одной и той же базы данных? Это может вызвать проблему с доступом к базе данных из обоих приложений одновременно. Или интеграция может быть выполнена на уровне гибернации, чтобы оба приложения могли использовать один и тот же сеанс гибернации? Но может ли приложение из одного экземпляра JVM получить доступ к объекту из другого экземпляра JVM?
Я был бы признателен за любые предложения по этому вопросу.
Обновить
Пользователь (из интерфейса веб-приложения) вводил URL-адреса для анализа сканером. Приложение-поисковик просто прочитает таблицы с URL-адресами, которые заполняет веб-приложение. И наоборот, данные, обработанные сканером, будут просто представлены в пользовательском интерфейсе. Итак, я думаю, мне не стоит беспокоиться о какой-либо блокировке, верно?
Спасибо, Никола
Ответ №1:
Я бы определенно разделил их, как вы планируете. Сканирование веб-страниц — это скорее «пакетный» процесс, чем веб-приложение, управляемое запросами. Приложение для обхода веб-страниц будет запускаться в своей собственной JVM, а ваше веб-приложение будет запущено в контейнере servlet / Java EE.
Как часто будет запускаться поисковый модуль или это постоянно выполняемый процесс? Возможно, вы захотите рассмотреть частоту в зависимости от ваших требований.
Будут ли пользователи из Web app обновлять те же таблицы, в которые сканер будет отправлять данные? В этом случае вам нужно будет принять меры предосторожности, иначе может возникнуть потенциальная взаимоблокировка. Если вы хотите, чтобы ваше веб-приложение автоматически обновляло данные на основе новых вставок в таблицы, вы можете создать компонент, управляемый сообщениями (используя JMS), для асинхронного уведомления веб-приложения из приложения-сканера. Когда приходит новое сообщение о вставке данных, вы можете либо отправить форму на своей странице, либо использовать ajax для обновления данных на самой странице.
Веб-приложение должно использовать пул соединений, а пакетное приложение может использовать DBCP или C3P0. Я не уверен, что вы получите много пользы, пытаясь совместно использовать сеансы базы данных в этом сценарии.
Таким образом, вы получаете интеграцию между двумя приложениями, не замедляя при этом работу друг друга в ожидании обработки другого.
HTH!
Комментарии:
1. Большое спасибо за ваш ответ! Пользователь вставил бы URL-адреса страниц для обхода сканером, но приложение-сканер просто прочитало бы эту таблицу, не обновляя ее каким-либо образом. Спасибо!
Ответ №2:
Вы правы, разделение приложения на два может быть разумным в вашем случае.
Недостатки разделения на два приложения —
- Вы не можете кэшировать в Hibernate или любых других кэшируемых изменяемых объектах, которые можно изменять из обоих приложений в любом из них. Оптимистичная блокировка должна нормально работать с двумя приложениями в режиме гибернации. Я не вижу никаких других проблем.
Преимущества, которые вы уже указали в своем коде.