Chủ Nhật, 7 tháng 8, 2016

Transaction trong EJB 2.1

CMP – Container Managed Persistent Bean trong EJB 2

Transaction trong EJB 2.1

Mục đích: nội dung của chủ đề này giới thiệu các khái niệm liên quan trên transaction và áp dụng transaction vào EJB 2.1. Để hiện thực hóa các khái niệm transaction, chúng ta sẽ thực hiện cài đặt transaction trên ứng dụng cụ thể

Transaction trong EJB 2.1

Mục đích: nội dung của chủ đề này giới thiệu các khái niệm liên quan trên transaction và áp dụng transaction vào EJB 2.1. Để hiện thực hóa các khái niệm transaction, chúng ta sẽ thực hiện cài đặt transaction trên ứng dụng cụ thể

Yêu cầu

  • Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
  • Nắm vững cú pháp và kiến thức về OOP
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22
  • Server: JBoss 4.2.3 GA
  • DBMS: SQL Server 2005

Các khái niệm về Transaction

  • Transaction là khái niệm có liên quan đến việc xử lý một chuỗi các qui trình công việc trong đó toàn bộ quá trình công việc được thành công hay hoàn tất khi tất cả các tác vụ trong qui trình xử lý thành công phải thành công. Dữ liệu sẽ được cập nhật khi toàn bộ tác vụ trong qui trình phải xử lý hoàn tất và không có bất kỳ sai sót xảy ra trong quá trình xử lý
  • Ngoài ra, transaction còn hướng tới đảm bảo dữ liệu không bị mất mát, hay bị phá vỡ trong quá trình thực thi, đảm bảo dữ liệu không bị sai lệch khi có nhiều đối tượng truy cập cùng một lúc (thể hiện tính toàn vẹn dữ liệu – data intergrity)
  • Transaction phải đảm bảo 4 thuộc tính ACID như sau
    • Atomicity: Các hoạt động xử lý của một qui trình công việc được nhóm thành 1 khối thống nhất theo cơ chế “được ăn cả, ngã về không” nghĩa là toàn bộ công việc chỉ thành công khi không có tác vụ nào bị hỏng trong lúc quá trình thực thi.
    • Consistency: dữ liệu trong hệ thống là trước sau như một vì trong quá trình xử lý dữ liệu trong khi transaction hoạt động diễn ra trong bộ nhớ trung gian, không làm ảnh hưởng đến hệ thống vật lý. Do vậy, khi transaction hoàn tất – lệnh committed được phát thì dữ liệu mới được cập nhật và đồng bộ
    • Isolation:
      • Tách biệt các transaction với nhau để các client có cảm giác đang trực tiếp thao tác trên CSDL.
      • Sử dụng các đối tượng trung gian, ánh xạ từ thành phần dữ liệu thật để người dùng có thể tương tác trên các đối tượng trung gian mà họ vẫn cảm tưởng như thật nhưng không ảnh hưởng đến thành phần dữ liệu thật
      • Cơ chế thực hiện:
        • Khi transaction diễn ra, dữ liệu trên CSDL được khóa lại, dữ liệu tương tác được nạp trên bộ nhớ trung gian (Record Set, DataSet, các bảng inserted, deleted …) để người dùng thao tác trên đó tránh việc thao tác trực tiếp trên CSDL trong cùng thời gian đảm bảo các hoạt động trên CSDL không ghi đè lên nhau giữa các transaction (có thể dẫn đến sự sai lệch dữ liệu hay dữ liệu rác).
        • Khi thực hiện hoàn tất transaction – lệnh commit được phát ra, hệ thống dùng cơ chế đồng bộ từ bộ nhớ xuống CSDL (sử dụng protocol đồng bộ giữa bộ nhớ và CSDL vật lý)
        • Ngược lại, khi transaction bị hỏng – lệnh rollback hay abort được phát thì các thành phần đối tượng trung gian bị hủy mà không ảnh hưởng gì đến dữ liệu được lưu trữ trong các thiết bị vật lý
    • Durability: khả năng phục hồi dữ liệu của hệ thống khi có sự cố xảy ra thông qua cơ chế backup và recovery. Dữ liệu chỉ bị mất một phần chứ không phải mất hoàn toàn nhằm đảm bảo khả năng xử lý chính xác khi hệ thống hoạt động ngay cả khi gặp sự cố
  • Các transaction có thể thực hiện tuần tự, lồng vào nhau hay tương tác lần nhau. Một số hệ thống hỗ trợ cơ chế multi-transaction – nhiều transaction có thể hoạt động cùng một lúc ngay cả khi có một hay một số transaction vẫn chưa hoàn tất
  • Có 02 cách áp dụng transaction vào trong ứng dụng
    • Declaratively: người phát triển phần mềm mô tả các yêu cầu hỗ trợ transaction từ container thông qua tập tin cấu hình – deployment descriptor
    • Programmatically: người phát triển phần mềm thực hiện việc khai báo như declaratively nhưng kết hợp thêm việc coding trong ứng dụng để tăng tính hiệu quả trong việc điều khiển và xử lý transaction
    • Lưu ý: hệ thống ứng dụng chúng ta đang tiếp cận đó là mô hình lắp ráp component với nhau và mỗi đối tượng đều có hỗ trợ transaction và tự động kich hoạt. Bên cạnh đó, các component độc lập không thể điều khiển lẫn nhau. Việc này dẫn đến việc khó đồng nhất trong hàng loạt tá c vụ trong một quá trình công việc. Do vậy, người ta đưa ra một cơ chế đó là hệ thống hỗ trợ transaction nhưng người điều khiển transaction là người phát triển phần mềm để đảm bảo quá trình đồng nhất các tác vụ trong quá trình làm việc là đảm bảo đồng nhất và có hiệu quả cao nhất trong thực hiện transaction
  • Để đồng nhất dữ liệu tại một lúc trên nhiều CSDL người ta áp dụng “Two phase commit protocol”
    • Ở giai đoạn khởi tạo ban đầu, đối tượng quản lý các transaction – transaction coordinator gửi message chuẩn bị đến các CSDL để yêu cầu thông báo trạng thái của các CSDL có thể commit hay rollback của công việc đang thực hiện.
    • Tất cả các CSDL thực hiện kiểm tra các móc thời gian từ khi lưu trữ thành công – checkpoint hay save point đến thời gian yêu cầu là hoạt động thành công hay có lỗi. Từ kết quả đó CSDL gửi response với trạng thái sẵn sàng commit, ngược lại sẽ gửi rollback hay abort.
    • Transaction coordinate tiến đến bước 02 nếu response là commit để thực hiện commit trên tất cả CSDL. Khi các CSDL hoàn tất tác vụ thì thông báo kết quả và trạng thái hoàn tất transaction đến cho transaction coordinator lưu trữ và sẵn sàng cho chu trình mới. Nếu kết quả không thành công thì tất cả hệ thống sẽ rollback lại trạng thái trước đó của hệ thống mà transaction coordinator đã lưu trữ

Khái niệm về transaction được áp dụng trong EJB 2.1

  • EJB Container hỗ trợ dịch vụ transaction cho EJB với phần chính yếu đó là sử dụng Java Transaction API (JTA)
  • Các phương thức trong EJB cần hỗ trợ transaction phải được định nghĩa hay khai báo trong deployment descriptor và áp dụng các thuộc tính được qui định như sau
    • Not Supported: Khi hàm hay phương thức được gọi, container không hỗ trợ transaction
    • Required: Khi hàm hay phương thức được gọi, container hỗ trợ transaction cho việc gọi hàm hay phương thức
    • Supports
      • Nếu client gọi hàm hay phương thức có sử dụng transaction thì container thực hiện các tác vụ như thuộc tính Required.
      • Ngược lại, áp dụng thuộc tính Not Supported
    • Required New: mỗi lần gọi hàm hay phương thức, container thực hiện tạo các transaction mới cho việc gọi hàm hay phương thức.
    • Mandatory – bắt buộc phải có transaction khi sử dụng hàm hay phương thức
      • Container phải yêu cầu các phương thức khi được gọi phải nằm trong một transaction hay có sử dụng transaction
      • Nếu client gọi phương thức sử dụng transaction thì container thực hiện các tác vụ như thuộc tính Required
      • Ngược lại, Container ném exception javax.ejb.TransactionRequiredException hay javax.ejb.TransactionRequiredLocalExeption tùy theo đặc điểm client (Remote hay Local)
    • Never – không được phép sử dụng transaction khi gọi hàm hay phương thức
      • Nếu client gọi phương thức sử dụng transaction thì Container ném exception java.rmi.RemoteException hay javax.ejb.EJBException tùy theo đặc điểm của client (Remote hay Local)
      • Ngược lại, container thực hiện các tác vụ như Not Supported.
  • Các bước xây dựng ứng dụng EJB có hỗ trợ transaction
    • Bước 1: xây dựng các thành phần EJB theo đúng yêu cầu của ứng dụng sử dụng session bean, entity bean
    • Bước 2: áp dụng các hàm api hỗ trợ transaction, cách hàm này chỉ áp dụng cho session bean, entity bean không cần hỗ trợ vấn đề này vì bản chất DBMS đã hỗ trợ đồng bộ transaction trong khi session bean thì không (do vậy, trong phần áp dụng thực tế chúng tôi sẽ mô tả 02 ứng dụng xử lý qui trình và xử lý CSDL riêng biệt để giúp quí vị thấy sự khác biệt khi vận dụng)
      • Bổ sung implements javax.ejb.SessionSynchronization trong phần khai báo của Session Bean để container có thể gọi các phương thức callback để hỗ trợ các dịch vụ transaction của bean
      • Ví dụ:

public class SStatefulBean implements SessionBean, SessionSynchronization

      • Cài đặt các phương thức callback hỗ trợ transaction như sau
        • afterBegin(): Container gọi phương thức này khi một phương thức được khai báo có hỗ trợ transaction trong session bean thực thi
        • beforeCompletion(): Container gọi phương thức này trước khi transaction hoàn tất đối với phương thức được khai báo có hỗ trợ transaction
        • afterCompletion(boolean committed): Container gọi phương thức này khi nhận được kết quả xử lý của transaction (trên từng phương thức được khai báo có hỗ trợ transaction( là commit hay rollback thông qua tham số committed.
    • Bước 3: bổ sung khai báo vào tập tin deployment descriptor để yêu cầu container trong khi thực thi hỗ trợ transaction (tập tin ejb-jar.xml)

<assembly-descriptor>

  <container-transaction>

    <method>

              <ejb-name>tên ejb</ejb-name>

              <method-name>tên phương thức/*</method-name>

    </method>

    <trans-attribute>thuộc tính</trans-attribute>

  </container-transaction>

  

</assembly-descriptor>

    • Lưu ý
      • *:  áp dụng cho tất cả phương thức có trong bean, có thể khai báo thêm tag method params để xác nhận tham số đối với các phương thức trùng tên nhưng khác đối số
      • Thuộc tính: các thuộc tính áp dụng cho từng loại bean đã mô tả trong phần thuộc tính
  • Các bước để truy cập và điều khiển ứng dụng EJB có transaction từ phía client
    • Tìm kiếm context hiện hành
    • Xác định transaction mà server hay container cung cấp cho người phát triển phần mềm dùng điểu khiển transaction. (Ở đây server J2EE cung cấp đối tượng UserTransaction được hỗ trợ bởi gói javax.transaction.UserTransaction)
    • Khi có transaction, chúng ta thực hiện việc mở transaction với phương thức begin(). Khi kết thúc transaction chúng ta sử dụng 1 trong 2 phương thức hoàn tất – commit() hay hủy transaction – abort()

Ứng dụng EJB áp dụng transaction trên ví dụ cụ thể dùng session bean, cụ thể là stateful session bean

  • Đầu tiên chúng tôi sẽ làm ví dụ mô tả chương trình ứng dụng sử dụng stateful bean có sử dụng transaction xử lý việc mua hàng và xuất kết quả của quá trình giao dịch mua hàng. Trong đó, người sử dụng có thể hoàn tất hay hủy mua hàng
  • Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 trong EJB 2.1
  • Bước 1: Tạo Enterprise Application Project tương tự như bước 2 của tutorial trong CMR 1:1
    • Tạo Project Enterprise Application có tên  Day9Transaction
    • Chúng ta chọn Server là JBoss 4.2.3 GA và version của Java EE là J2EE 1.4 bởi vì chúng ta đang tạo trên nền EJB 2.1
    • Chúng ta sẽ có project trên NetBeans như sau

  • Bước 2: Tạo Stateful Session Bean
    • Click chuột phải trên Enterprise Beans của gói ejb (Day9Transactions-ejb), chọn New, chọn Other

    • Chọn JavaEE trong categories, chọn Session Bean trong File Types, click Next

    • Đặt tên bean (TransBean), gõ tên package (sample.transaction), chọn Stateful, chọn cả Remote và Local.

    • Nhấn nút Finish, project được phát sinh như sau

      • Tập tin ejb-jar.xml được Netbeans cập nhật tự động như sau

    • Khung đỏ thê hiện khai báo transaction được hỗ trợ tất cả phương thức trong bean thông qua tag <method name> với giá trị *
    • Bên cạnh đó, thuộc tính hỗ trợ transaction thông qua tag <trans-attribute>
  • Bước 3: phát sinh interface hỗ trợ transaction và một số business method cho EJB
    • Bổ sung thêm phần implementations SessionSynchronization vào trong phần khai báo của class bean để hiện thực các phương thức callback để container có thể truy cập và hỗ trợ transaction khi bean được thực thi

    • Nhấn chuột trái trên bóng đèn để phát sinh các phương thức abstract method, chọn Implement all abstract methods

      • Khi click chuột chương trình sẽ phát sinh 3 hàm tương ứng là afterBegin, beforeCompletion, và afterCompletion

    • Để bổ sung việc cập nhật giá trị và tính toán tổng giá trị chúng ta cần khai báo các thuộc tính sau
      • user: phân biệt từng user một
      • total: giá trị tổng cuối cùng sau khi việc mua hoàn tất – transaction hoàn tất
      • newTotal: giá trị tổng cập nhật mới tạm thời, giá trị này sẽ cập nhật cho total khi transaction hoàn tất, ngược lại giá trị total vẫn giữ nguyên như cũ

    • Phát sinh hàm business method có tên buy trong bean class
      • Click phải chuột trên code, chọn Insert code, chọn business method

      • Phát sinh phương thức buy (tăng tiền lên sau mỗi lần mua) với tham số price và phát sinh cả 02 interface remote lẫn local (Both) như sau

      • Tương tự phát sinh tiếp business method int getTotal() và cập nhật thân hàm của hàm getTotal, hàm buy và hàm ejbCreate như sau

    • Cập nhật giá trị của các hàm callback method hỗ trợ transaction như sau
      • Phương thức afterBegin sẽ được kích hoạt ngay khi phương thức buy được gọi, do vậy chúng ta cập nhật giá trị newTotal bằng total hiện hành để có thể tiến hành cập nhật tổng mới khi mua hàng

      • Phương thức beforeCompletion sẽ được kích hoạt sau khi phương thức buy thực thi và trước khi phương thức afterCompletion. Tuy nhiên ở đây chúng ta không cần checking giá trị, do vậy, chúng ta không vận dụng code gì ở đây (trong trường hợp cần checking giá trị hay validation giá trị trong vùng giá trị qui định hay theo một pattern chúng ta sẽ đặt code ở đây)
      • Phương thức afterCompletion sẽ được kích hoạt khi transaction nhận lệnh commit hay rollback. Do vậy khi kiểm tra giá trị true là commit thì chúng ta cập nhật giá trị total thực sự bằng newTotal, ngược lại cập nhật newTotal về giá trị lưu trữ ban đầu đó là giá trị gốc đang lưu trữ trong total

    • Khi hoàn tất các bước trên, chúng ta thấy các thành phần interface của Remote và Local được cập nhật như sau

  • Bước 4:  Cấu hình thông tin để sử dụng và mapping bean, áp dụng tương tự như tutorial CMR 1:1

    • Lưu ý
      • Tên tag ejb-name phải được mapping chính là tag ejb-name trong tập tin ejb-jar.xml (cụ thể TransBean)
      • Tên jndi là do chúng ta đặt, tên này chúng ta sẽ dùng truy cập bean
      • Ở đây chúng ta dùng tag local-jndi-name vì các cmp được phát sinh chỉ có Local và Local Home Interface
    • Chúng ta hoàn tất xong việc mapping bean
    • Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean và chúng ta tiến tới sử dụng bean trong ứng dụng web
  • Bước 5: Tạo giao diện web để sử dụng các chức năng kết hợp transaction như sau
    • Chúng tôi mô tả 3 lần giao dịch mua hàng, 02 lần đầu sẽ commit – chấp nhận mua, lần cuối cùng chúng tôi sẽ rollback – hủy lần mua cuối cùng
    • Kết quả mong đợi tổng tiền của chúng ta là tổng của 02 lần đâu tiên, lần cuối cùng sẽ không cập nhật giá trị vào tổng chung
    • Chúng ta chuyển sang gói Day9Transactions-war, chỉnh sửa giao diện tập tin index.jsp như sau

    • Phát sinh Controller để sử dụng như sau

      • Chúng ta sử dụng UserTransaction để có thể điều khiển việc bắt đầu và kết thúc transaction, còn việc thực hiện transaction sẽ do container thực hiện
      • Cấu trúc ứng dụng web và project được cập nhật như sau

  • Bước 6: Thực hiện Build Project, Start Server, Deploy để testing thư
    • Deploy tập tin ear vào trong thư mục đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 4.2.3 GA), ta thấy trên server

      • Lưu ý:
        • Chúng ta cứ chờ cho việc deploy hoàn tất, không nên vội vã, bất cứ hành động nhanh nhẩu nào sẽ gây lỗi cho code phát sinh
    • Thực hiện testing tương tự như tutorial CMR 1:1
      • Click chuột phải trên thành phần gói war trong gói ứng dụng của Enterprise Application, chọn Open in Browser

      • Kết quả nhập liệu testing

  • Chúng ta đã hoàn tất được ứng dụng có hỗ trợ transaction trên session bean từ container thông qua các tham số khai báo của chúng ta trong tập tin deployment descriptor ejb-jar.xml

Ứng dụng EJB áp dụng transaction trên ví dụ cụ thể dùng entity bean, cụ thể là cmp

  • Tiếp theo, chúng tôi sẽ làm ví dụ mô tả chương trình ứng dụng sử dụng cmp có sử dụng transaction xử lý việc cập nhật các giá trị một field trong DB sử dụng transaction hỗ trợ của container để cho thấy việc khác biệt của session bean và entity bean trong mô hình ứng dụng EJB 2.1.
  • Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 và CMP trong EJB 2.1
  • Chúng tôi sẽ thực hiện với DB có cấu trúc như sau

  • Bước 1: Đăng ký Datasource với Netbeans để Netbeans hỗ trợ chúng ta trong việc phát sinh datasource (bước này có thể bỏ qua nếu bạn đã có datasource rồi) (Vui lòng xem chi tiết Bước 1 trong tutorial CMR 1:1)
    • Nếu Datasource với DB mà có chứa các bảng mà chúng ta thao tác đã được đăng ký rồi,
      • Vào trong tab Services, mở rộng phần Database
      • Click phải chuột trên connection mà chúng ta cần làm việc, chọn Connect …

      • Chúng ta nhập username và password để kết nối DB, click OK

    • Lưu ý: Một Database Connection chỉ dùng cho một DB cụ thể, không thể áp dụng cho tất cả các Database vì mỗi Database Connect có 1 chuỗi kết nối đến một DB cụ thể
    • Bước 2: Tạo Enterprise Application Project tương tự như bước 2 của tutorial trong CMR 1:1
      • Tạo Project Enterprise Application có tên  CMPTransaction
      • Chúng ta chọn Server là JBoss 4.2.3 GA và version của Java EE là J2EE 1.4 bởi vì chúng ta đang tạo trên nền EJB 2.1
      • Chúng ta sẽ có project trên NetBeans như sau

  • Bước 3: Tạo Entity Bean chứa đựng CMP tương tự như bước 3 của tutorial trong CMR 1:1
    • Tạo CMP
      • Tạo Datasource có tên là  CMPTransDS, tập tin jboss-ds.xml tại Server Resource sẽ được cập nhật như hình bên dưới

      • Tạo CMP
        • Sau khi các bảng được lấy về, chúng ta chọn bảng cần phát sinh CMP (ở đây là bảng tblAccount) và nhấn nút Add >
        • Chúng ta click nút Next

        • Đặt tên package cho code của chúng ta trong ô Package (ở đây tôi nhập sample.cmp)
        • Chúng ta nhấn nút Finish để hoàn tất quá trình tạo bean
        • Netbeans phát sinh và cập nhật project chúng ta với 02 bean được tạo ra như sau
      • Lưu ý: code phát sinh luôn luôn là abstract và container sẽ phát sinh code tương ứng khi chạy và deploy

      • Netbeans cũng phát sinh tương ứng việc mapping thông qua tập tin ejb-jar.xml như sau

    • Kết thúc bước này chúng ta đã tạo được bean và mapping được cmp nhưng chúng ta vẫn chưa sử dụng được chúng
  • Bước 4: Cấu hình thông tin để sử dụng và mapping bean, áp dụng tương tự như tutorial CMR 1:1
    • Mapping bean để khi deploy server có thể quản lý và đưa ra tên để chúng ta kết nối tới khi sử dụng trong tập tin jboss.xml như hình vẽ bên dưới

      • Lưu ý
        • Tên tag ejb-name phải được mapping và copy từ tập tin ejb-jar.xml
        • Ở đây chúng ta dùng tag local-jndi-name vì các cmp được phát sinh chỉ có Local và Local Home Interface
    • Chúng ta hoàn tất xong việc mapping bean
  • Chúng ta thực hiện mapping DB và đồng bộ giữa instance object và DB thông qua tập tin jbosscmp-jdbc.xml. Nội dung tập tin jbosscmp-jdbc.xml cụ thể như sau

 

      • Kết thúc bước này chúng ta hoàn tất được jbosscmp-jdbc.xml.
      • Lưu ý:
        • Nếu không có tập tin này thì không tồn tai, chương trình vẫn chạy bình thường nhưng sẽ không đồng bộ dữ liệu xuống DB, DB sẽ không có tác động gì trong quá trình thao tác
    • Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean
  • Bước 5: Tạo phương thức insert dữ liệu mới xuống DB và bean – áp dụng tương tự các phương thức phát sinh code do tools Netbeans hỗ trợ như bước 5 trong tutorial CMR 1:1
    • Vào trong tập tin TblAccount.java, chúng ta cần tạo hàm insert, nghĩa là phương thức Create Method, phương thức insert sẽ không có khóa chính
    • Hàm phát sinh ra bao gồm 02 hàm ejbCreate và ejbPostCreate, và viết code như hình bên dưới

    • Kết thúc bước này chúng ta đã hoàn tất xong chức năng insert cho bean
  • Bước 6: Tạo giao diện web để sử dụng chức năng insert và sử dụng transaction trên DB như sau
    • Chúng ta chuyển sang gói CMPTransaction-war, chỉnh sửa giao diện tập tin index.jsp như sau

    • Cập nhật Controller – Servlet với package sample.web xử lý như sau

      • Phần import gồm những nội dung như sau

    • Sau khi insert thành công chúng ta sẽ chuyển sang trang process.jsp để cập nhật giá trị balance của account trong DB và áp dụng transaction để hiệu lực giá trị của nó
      • Trang này sẽ trình bày thông tin liên quan account và số dư còn lại
      • Trang cho phép người ta cập nhật giá trị sô dư của account

    • Cập nhật giá trị xử lý transaction trên Controller
      • Kết quả xử lý sẽ chuyển lại trang process.jsp để cập nhật giá trị
      • Lưu ý trong trang phải sử dụng transaction để người dùng điều khiền transaction

    • Bước 7: Thực hiện Build Project, Start Server, Deploy để testing thư
      • Deploy đến Server: deploy tập tin jboss-ds.xml tại thư mục
        <Thư mục lưu trữ project>\ CMPTransaction\ CMPTransaction-ejb\setup\đến JBOSS_HOME\server\default\deploy. Chúng ta thấy server có kết quả y như tên chúng ta điền vào datasource jbosscmp-jdbc.xml

      • Deploy tập tin ear vào trong thư mục đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 4.2.3 GA), ta thấy trên server

      • Thực hiện testing, chọn tab Services, chọn Servers, chọn Enterprise Application, chọn tên Project, chọn tên project gói war
      • Click chuột phải, chọn, Open in Browser
      • Kết quả testing demo như sau
        • DB trước khi Insert

        • Kết quả nhập liệu testing

      • Chỉnh sửa giá trị deposit và withdrawn với transaction, nhấn nút commit như sau

      • Cập nhật thêm giá trị và nhấn nút Rollback như sau

  • Ngoài ra, ở đây chúng tôi sẽ được cách thức đơn giản hóa việc sử dụng transaction của người dùng trên CMP bằng cách đặt các thành phần xử lý transaction ngay trong bean và cung cấp phương thức trực tiếp ở bên ngoài mà người dùng không cần quan tâm việc điều khiển transaction
    • Chúng ta bổ sung phương thức Home method (tương tự như bài EntityBean – CMP của EJB 2.1) có tên là updateBalance trong bean class
      • Click phải chuột trong bean class chọn Insert Code, chọn Add Home Method …

      • Bởi vì trong lúc xử lý chúng ta sẽ thực hiện tìm kiếm 1 instance bean cụ thể, nên chúng ta phải add FinderException cho hàm bằng cách chọn tab Exception, nhấn nút Add, gõ vào FinderE, FinderException sẽ hiển thị như hình bên dưới

      • Chọn FinderException của javax.ejb, nhấn nút OK

      • Nhấn nút OK, hàm sẽ được phát sinh có dạng ejbHomeUpdateBalance. Chúng ta thực hiện cập nhật hàm như sau

    • Chúng ta cập nhật giao diện của trang process.jsp của gói CMPTransaction-war với việc bổ sung nút Deposit để xử lý việc tăng tài khoản của user hiện hành

    • Chúng ta cập nhật Controller để xử lý kết quả của Deposit như sau

      • Lưu ý:
        • Ở đây chúng ta thấy sự khác biệt khi code xử lý kết quả không có nội dung gì liên quan đến transaction, chúng ta để transaction để container tự hỗ trợ và xử lý đem lại sự đơn giản cho người dùng
        • Việc chúng tôi đưa ra 02 phương cách để chúng ta lựa chọn tùy từng trường hợp, không có cách nào tối ưu cả.
        • Chúng ta nhận thấy rằng nếu để giấu trong bean thì tất cả sẽ khó điều khiển transaction khi nó liên quan đến hàng loạt thao tác của rất nhiều component
    • Chúng ta thực hiện Build, Deploy, Testing Project
      • DB trước khi thực hiện như sau

      • Testing chương trình

      • Nhập giá trị deposit lớn hơn 50

      • Nhập giá trị Deposit dưới 50

Chúng ta đã hoàn tất được các ứng dụng có hỗ trợ transaction từ container thông qua các tham số khai báo của chúng ta trong tập tin deployment descriptor ejb-jar.xml trên cả session bean và entity bean.

Qua các ví dụ trên chúng ta thấy rõ khái niệm về transaction, sự khác nhau về cài đặt và hỗ trợ transaction đối với session bean và entity bean

Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt transaction trên các phương thức của EJB. Rất mong bài viết sẽ giúp ích cho bạn trong việc sử dụng và làm quen đến các khái niệm mở rộng và nâng cao của EJB 2.x, đặc biệt ở đây là mở rộng khái niệm về transaction

Rất mong sự góp ý chân thành của các bạn và hẹn các bạn trong bài tiếp theo về transaction trên EJB 3.0, security trên các ứng dụng EJB 2.1 và EJB 3.0

 

Không có nhận xét nào:

Đăng nhận xét