如何将从消息驱动的 bean 中检索到的数据保存到数据库中?
How to save to database data retrieved from a message driven bean?
我想为应用程序使用 n 层架构,以便客户端层、Web 层、业务层和数据层是分开的。我想知道具有消息的消息驱动 bean 如何在不更改体系结构的情况下将其保存到数据库中。 (那是使用一个普通的会话 bean,我检索了通过 JSP 页面输入到 servlet 的数据,并从名为 bean class 的 servlet 检索了对数据库有操作的数据,这是不可能的消息驱动的 bean,因为它已经有一个重写的方法 onMessage)
到目前为止,我可以直接使用消息 bean 从 servlet 检索值,但我想将其更改为数据库操作不在 servlet 中的 4 层架构。
我的 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) {
}
}
您必须考虑两种可能的工作流程:
- 同步交互。
- 异步交互。
下面我画了一个可能的架构,涵盖了引导工作流程。组成部分是:
- DAO:数据访问对象层。这负责在没有业务逻辑的情况下持久化和查询数据库。使用无状态会话 Bean 实现
- BL:业务逻辑层。这是负责流程业务逻辑,不知道数据将被持久化或查询在哪里只是调用 DAO 层。也独立于视图层(Web、Web Service、Rest 等)。
- Serlvet:在这种情况下表示视图层或与用户直接调用 BL 以处理数据检索的 Web 交互。
- MDB:该层用于异步事件,它从队列(或主题)中取出消息,然后调用 BL 层处理检索到的数据。
此架构支持代码重用和职责分离。
有两个工作流程的图表。
- 同步工作流程:
- Servlet调用BL.
- BL调用DAO。
- DAO 与数据库交互
- 异步工作流程:
- 我。 Servlet 将消息 A、B、C 排队
- 二。 MDB 出列 A
- 三。 MDB 调用 BL.
- 四。 BL调用DAO.
- v。 DAO 与数据库交互
我想为应用程序使用 n 层架构,以便客户端层、Web 层、业务层和数据层是分开的。我想知道具有消息的消息驱动 bean 如何在不更改体系结构的情况下将其保存到数据库中。 (那是使用一个普通的会话 bean,我检索了通过 JSP 页面输入到 servlet 的数据,并从名为 bean class 的 servlet 检索了对数据库有操作的数据,这是不可能的消息驱动的 bean,因为它已经有一个重写的方法 onMessage)
到目前为止,我可以直接使用消息 bean 从 servlet 检索值,但我想将其更改为数据库操作不在 servlet 中的 4 层架构。
我的 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) {
}
}
您必须考虑两种可能的工作流程:
- 同步交互。
- 异步交互。
下面我画了一个可能的架构,涵盖了引导工作流程。组成部分是:
- DAO:数据访问对象层。这负责在没有业务逻辑的情况下持久化和查询数据库。使用无状态会话 Bean 实现
- BL:业务逻辑层。这是负责流程业务逻辑,不知道数据将被持久化或查询在哪里只是调用 DAO 层。也独立于视图层(Web、Web Service、Rest 等)。
- Serlvet:在这种情况下表示视图层或与用户直接调用 BL 以处理数据检索的 Web 交互。
- MDB:该层用于异步事件,它从队列(或主题)中取出消息,然后调用 BL 层处理检索到的数据。
此架构支持代码重用和职责分离。
有两个工作流程的图表。
- 同步工作流程:
- Servlet调用BL.
- BL调用DAO。
- DAO 与数据库交互
- 异步工作流程:
- 我。 Servlet 将消息 A、B、C 排队
- 二。 MDB 出列 A
- 三。 MDB 调用 BL.
- 四。 BL调用DAO.
- v。 DAO 与数据库交互