Как сохранить в базе данных данные, полученные из bean-компонента, управляемого сообщениями?

Я хочу использовать n-уровневую архитектуру для приложения, чтобы уровень клиента, веб-уровень, бизнес-уровень и уровень данных были отдельными. Мне интересно, как bean-компонент, управляемый сообщениями, который имеет сообщение, сохраняет его в базе данных без изменения архитектуры. (Это использование обычного сеансового bean-компонента, я извлекал данные, введенные через страницу JSP в сервлет, и из сервлета, называемого классом bean-компонента, который выполнял операции с базой данных, это невозможно сделать с bean-компонентами, управляемыми сообщениями, поскольку он уже переопределенный метод onMessage)

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

мой код сервлета

@Resource(mappedName = "jms/dest")
private Queue dest;
@Resource(mappedName = "jms/queue")
private ConnectionFactory queue;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    String str = request.getParameter("message");

    try {
        sendJMSMessageToDest(str);
    } catch (JMSException ex) {

    }


private Message createJMSMessageForjmsDest(Session session, Object messageData) throws JMSException{
    TextMessage tm = session.createTextMessage();
    tm.setText(messageData.toString());
    return tm;
}
private void sendJMSMessageToDest(Object messageData) throws JMSException{
    Connection connection = null;
    Session session = null;

    try {
        connection = queue.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer messageProducer = session.createProducer(dest);
        messageProducer.send(createJMSMessageForjmsDest(session,messageData));
    } catch (JMSException ex) {

    }
}

person dopplegang1234    schedule 08.05.2016    source источник


Ответы (1)


Вы должны продумать два возможных рабочих процесса:

  1. Синхронное взаимодействие.
  2. Асинхронное взаимодействие.

Ниже я рисую возможную архитектуру, охватывающую рабочие процессы загрузки. Компоненты:

  • DAO: уровень объектов доступа к данным. Это отвечает за сохранение и запрос базы данных без бизнес-логики. Реализовано с помощью сеансовых компонентов без сохранения состояния
  • BL: уровень бизнес-логики. Это отвечает за бизнес-логику процесса, не знаю, где данные будут сохраняться или запрашиваться, просто вызывает уровень DAO. Также не зависит от уровня просмотра (Интернет, Веб-служба, Отдых и т. Д.).
  • Serlvet: в этом случае представляет слой представления или веб-взаимодействие с пользователем, который обращается непосредственно к BL для обработки полученных данных.
  • MDB: этот уровень предназначен для асинхронных событий, он удаляет сообщения из очереди (или темы), а затем вызывает уровень BL для обработки полученных данных.

Эта архитектура допускает повторное использование кода и разделение ответственности.

Это диаграмма с двумя рабочими процессами.

Пример многоуровневой архитектуры JEE

  1. Syncrhonous workflow:
    1. Servlet call BL.
    2. BL позвонить в DAO.
    3. DAO взаимодействует с базой данных
  2. Asyncrhonous workflow:
    • i. Servlet enqueues message A,B,C
    • II. MDB из очереди A
    • iii. MDB звонит BL.
    • iv. BL позвонить в DAO.
    • v. DAO взаимодействует с базой данных
person Ernesto Campohermoso    schedule 08.05.2016
comment
Большое спасибо! Значит, должен существовать сессионный компонент без сохранения состояния, который должен использоваться вместе с компонентом, управляемым сообщениями? - person dopplegang1234; 09.05.2016
comment
Да, единственная цель MDB - получить сообщение (исключить из очереди), проверить его, а затем вызвать другую бизнес-логику без сохранения состояния. - person Ernesto Campohermoso; 10.05.2016