2016-05-08 91 views
1

我想爲應用程序使用n層架構,因此客戶端層,Web層,業務層和數據層是分開的。我想知道消息驅動bean如何在不改變體系結構的情況下將消息保存到數據庫中。 (這是使用正常的會話bean,我檢索到通過JSP頁面輸入到servlet的數據,並從servlet調用了對數據庫有操作的bean類,但它不可能使用消息驅動的bean執行此操作,因爲它已經具有onMessage上的重寫方法)如何保存到從消息驅動bean檢索的數據庫數據?

到目前爲止,我可以直接使用消息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) { 

    } 
} 

回答

0

你一定認爲有兩種可能的工作流程:

  1. 同步互動。
  2. 異步交互。

下面我畫了一個覆蓋啓動工作流程的可能架構。這些組件是:

  • DAO:數據訪問對象層。這是負責持久性和查詢沒有業務邏輯的數據庫。用無狀態會話Bean實現
  • BL:業務邏輯層。這是流程業務邏輯的責任,不知道數據將被持久或查詢的地方只是調用DAO層。也獨立於View層(Web,Web Service,Rest等)。
  • Serlvet:在這種情況下,表示視圖層或網絡與用戶直接調用BL進行交互以獲取檢索的進程數據。
  • MDB:該層用於異步事件,它將來自隊列(或主題)的消息出隊,然後調用BL層以處理檢索到的數據。

該架構支持代碼重用和責任分離。

Theres是具有兩個工作流程的圖表。

JEE Multi Layer Architecture example

  1. Syncrhonous工作流程:
    1. Servlet的通話BL。
    2. BL致電DAO。
    3. DAO inteacts與數據庫
  2. Asyncrhonous工作流程:
    • 我。 Servlet入隊消息A,B,C
    • ii。MDB出列A
    • iii。 MDB致電BL。
    • iv。 BL叫DAO。
    • 訴DAO與數據庫進行交互
+0

非常感謝您!所以應該有一個無狀態的會話bean,它必須與消息驅動bean一起使用? – dopplegang1234

+0

是的MDB的唯一目的是獲取消息(出隊),驗證它,然後調用其他無狀態的業務邏輯。 –

+0

再次感謝你,你是一個拯救生命的人! – dopplegang1234

相關問題