【问题标题】:How to save to database data retrieved from a message driven bean?如何保存从消息驱动 bean 检索到的数据库数据?
【发布时间】:2016-05-08 07:31:04
【问题描述】:

我想为应用程序使用 n 层架构,因此客户端层、Web 层、业务层和数据层是分开的。我想知道具有消息的消息驱动 bean 如何在不更改架构的情况下将其保存到数据库中。 (即使用普通会话 bean,我检索通过 JSP 页面输入到 servlet 的数据,并从名为 bean 类的 servlet 中检索到,该 bean 类对数据库进行了操作,由于消息驱动 bean 已经有一个被覆盖的方法 onMessage)

到目前为止,我可以直接使用消息 bean 从 servlet 中检索值,但我想将其更改为 4 层架构,其中数据库操作不在 servlet 中。

我的 servlet 代码

@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) {

    }
}

【问题讨论】:

    标签: database jakarta-ee message-driven-bean


    【解决方案1】:

    您必须考虑两种可能的工作流程:

    1. 同步交互。
    2. 异步交互。

    下面我画了一个可能的架构,涵盖了启动工作流程。组件是:

    • DAO:数据访问对象层。这负责在没有业务逻辑的情况下持久化和查询数据库。使用无状态会话 Bean 实现
    • BL:业务逻辑层。这负责流程业务逻辑,不知道数据将被持久化或查询到哪里,只是调用DAO层。也独立于 View 层(Web、Web Service、Rest 等)。
    • Serlvet:在这种情况下,代表视图层或 Web 交互,用户直接调用 BL 以获取检索到的数据。
    • MDB:该层用于异步事件,它从队列(或主题)中取出消息,然后调用 BL 层以处理检索到的数据。

    这种架构支持代码重用和职责分离。

    有两个工作流程的图表。

    1. 同步工作流程:
      1. Servlet 调用 BL。
      2. BL 调用 DAO。
      3. DAO 与数据库交互
    2. 异步工作流:
      • i. Servlet 将消息 A、B、C 排入队列
      • 二。 MDB 出队 A
      • 三。 MDB 调用 BL。
      • 四。 BL 调用 DAO。
      • 诉。 DAO 与数据库交互

    【讨论】:

    • 非常感谢!那么应该有一个无状态会话 bean 必须与消息驱动 bean 一起使用?
    • 是的,MDB 的唯一目的是获取消息(出队),对其进行验证,然后调用其他无状态的业务逻辑。
    猜你喜欢
    • 2014-03-18
    • 2010-09-20
    • 1970-01-01
    • 2019-02-06
    • 2014-09-05
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多