Giao diện từ xa tạo cung cấp các phương thức công cộng cho phép truy nhập tới các lớp EJB. Giao diện từ xa thừa kể từ javax.EJB.EJBObject. Giao diện từ xa cho phép EJB client có thể thực hiện:
• Lấy giao diện tại chồ.
• Xóa bỏ biển thể của EJB.
• Lấy handle của biến thể EJB.
Lớp EJB là phần thứ hai của thành phần EJB. Lớp EJB thực hiện việc cài đặt các phương thức cần thiết để giải quyết các vấn đề nghiệp vụ cần xử lý. Các phương thức này được gọi thông qua phương thức tương ứng trona giao diện từ xa. Lớp EJB phải thực hiện việc cài đặt giao diện javax.EJB.EntityBean hoặc javax.EJB.SessionBean.
Ngoài các phương thức thône thường, lớp EJB và giao diện từ xa còn chia sẻ việc thực hiện hai loại phương thức đặc biệt là các phương thức tạo và các phương thức tìm kiếm. Các phương thực tạo cho phép thực hiện các yêu cầu đặc biệt khi tạo ra các đối tượng này và các phương thức tìm kiếm tạo ra cơ chế tìm kiếm các biển thể EJB.
Đối với mỗi phương thức createf) trong giao diện tại chồ phải có một phương
thức ejbCreate() tương ứng được cài đặt trong lớp EJB. Mỗi phương thức fin d e r0
trong giao diện tại chồ phải có một phương thức ejbFindBy() tương ứng được cài
đặt trong lớp EJB. ỉ lơn thế nữa các lớp EJB phải thực hiện việc cài đặt cho tất cả các phương thức trong giao diện mà nó dựa trên đó. [4]
2.4 Session Bean
Session Bean dùng để thể hiện các công việc được thực hiện khi các client gọi đến nó. Session Bean dùng để triển khai Logic nghiệp vụ, các luật nghiệp vụ và các dòng công việc. Ví dụ, các Session Bean được dùng để tính giá, cập nhập đơn đặt hàng, nén dừ liệu, các tính toán phức tạp, ... Đây là các thành phần có thể sử dụng lại chứa Logic của các qui trình nghiệp vụ.
Các biến thể của Session Bean chỉ có thể được sử dụng bởi một người sử dụng lại một thời điểm, nó khône thể được chia sẻ bởi nhiều người sử dụng.
Session Bean được gọi như vậy bởi nó chỉ tồn tại trong một phiên giao dịch của người sử dụng gọi đến nó. Ví dụ, khi ứng dụng máy khách gọi một Session Bean để thực hiện việc đưa một mặt hàng vào đơn hàng, bộ chứa EJB có nhiệm vụ tạo ra
- 2 6 -
biến thể của thành phần Session Bean tương ứng. Khi máy khách cắt đường kết nổi, bộ chứa EJB sẽ thực hiện việc hủy bỏ biến thể này.
Các bộ chứa EJB có trách nhiệm quản lý vòng đời của các Session Bean. Người sử dụng không thực hiện việc khởi tạo các Session Bean. Công việc này do bộ chứa EJB tự động thực hiện. Tương tự như vậy, bộ chửa EJB cũng tự động thực hiện việc hủy bỏ các Session Bean. Chính nhờ khả năng này mà bộ chứa EJB có thể thực hiện việc tập trung tại và cho phép tái sử dụng các Session Bean.
Có hai loại Session Bean là các Session Bean Trạng Thái và các Session Bean Phi Trạng Thái. [2]
2.4.1 S e s s io n B e a n T rạ n g T hái
Như đã đề cập ở trên, các Session Bean dùng để thực hiện các tiến trình nghiệp vụ. Một số tiến trình được thực hiện bởi một phương thức duy nhất. Nhưng có nhừng tiến trình đòi hỏi phải được thực hiện Ihông qua một chuỗi các phươna thức.
Ví dụ, việc quản lý Giỏ hàng trong thương mại diện tử. Người sừ dụng có thể thực
hiện đưa vào đây nhiều mặt hàng khác nhau. Như vậy, trạng thái của Giỏ hàng được
duy trì qua nhiều phương thức khác nhau theo yêu cầu của người sử dụng.
Các Session Bean Trạng Thái dùng để thực hiện các tiến trình nghiệp vụ được thực hiện qua nhiều lời gọi phương thức khác nhau hay trong một giao dịch. Để thực hiện được yêu cầu này, đòi hỏi các Session Bean phải có khả năng duy trì trạng thái của nó thay cho người sử dụng. Nếu trạng thái của nó thay đổi bởi một phương thức nào đó thì trạng thái này sẽ được thấy trong lần gọi phương thức tiếp theo. [2]
2.4.2 S e s s io n B e a n P h i T rạ n g T h á i
Một số tiến trình nghiệp vụ có thể thực hiện với chỉ một lời gọi phương thức. Các tiến trình này không đòi hỏi phải duy trì trạng thái giữa các lời gọi phương thức. Các Session Bean Phi Trạng Thái được dùng để thực hiện các tiến trình này. Ví dụ các Session Bean Phi Trạng Thái có thể được dùng để thực hiện các tính toán
phức tạp, nén dừ liệu. Các Session Bean này không cần phải duy trì trạng thái của
Các Session Bean Phi Trạng Thái sau khi thực hiện xong một yêu cầu của một neười sử dụng nào đó lập tức có thể sằn sàng thực hiện yêu cầu của người sử dụng k h á c . [2]
2.4.3 P h á t triể n c á c S e s s io n B e a n
Đê viết các lớp Session Bean phải thực hiện cài đặt giao diện
javax.ejb.SessionBean. Giao diện này có một số phương thức bất buộc phải được cài đặt. Các phương thức này được sử dụng bởi bộ chứa EJB. Bộ chứa EJB sẽ gọi các phương thức này khi cần thôns báo những sự kiện quan trọng cho các Session Bean. [2]
Giao diện Session Bean được định nghĩa như sau:
public interface javax. ejb. SessionBean extends javax. ejb. EnterpriseBean
{
public abtract void setSessionContext (SessionContext ctx) throws java. rmi. RemoteException;
public abtract void ejbPassivate()
throws java. rmi. RemoteException; public abtract void ejbActivate()
throws java. rmi. RemoteException; public abtract void ejbRemove()
throws java. rmi. RemoteException;
}
2.4.3. Ĩ setSessionContext (SessionContext ctx)
Bộ chứa EJB gọi phương thức này khi nó thực hiện kết gắn một ngừ cảnh của phiên giao dịch cho một Session Bean. Ngữ cảnh của phiên giao dịch là cổng giao tiêp giữa Session Bean và bộ chứa EJB. Thông qua ngừ cảnh của phiên giao dịch, các Session Bean có the hỏi bộ chứa EJB về trạng thái của giao dịch, trạng thái bảo mật và các thông tin khác.
- 28 -
Thông thường trong phương thức này các Session Bean thườne thực hiện việc lưu lại trạna thái của ngữ cảnh trong một thuộc tính của nó. Ví dụ:
import javax. ejb. *;
public class MyBean implements SessionBean { private SessionBean ctx;
public void setSessionContext (SessionContext ctx) { this.ctx=ctx;
} }
2.43.2 ejbCreate()
e j b C r e a t e ( ) thực hiện việc khởi tạo Session Bean. Có thể định nghĩa nhiều
e j b C r e a t e ( ) khác nhau, mồi phương thức nhận các bộ tham số khác nhau. Với nhiều phương thức khác nhau cho phép khởi tạo Session Bean theo nhiều cách khác nhau.
Việc cài đặt phương thức e jb C r e a t e ( ) đòi hỏi phải thực hiện các công việc khởi tạo cần thiết cho Session Bean chẳng hạn như việc khởi tạo các thuộc tính của nó.
Ví dụ:
import javax. ejb. *;
public class MyBean implements SessionBean { private int memberVariable;
public void ejbCreate (int initialValue) { this. memberVariable= initialValue;
} }
Các phương thức e jb C r e a t e ( ) chỉ được gọi bởi các bộ chứa EJB. Các ứng dụng khách không bao giờ gọi các phương thức này bởi các ứng dụng này không làm việc trực tiếp với các Session Bean mà chỉ thực hiện việc tương tác với các Session Bean thông qua bộ chứa EJB. Nhưng các tham số của phương thức e jb C r e a t e ( ) do ứng dụng khách cung cấp. Vì vậy, các ứng dụng khách cần một cơ chế để chuyển các tham số này. Cơ chế chuyển các tham số này được thực hiện thông qua giao
diện tại chồ của Session Bean. Vì vậy, với mỗi phươne thức e jb C r e a te Q trong lớp Session Bean cần phải có một phương thức tươns ứng trone giao diện tại chồ.
Ví dụ, phương thức trong lớp Session Bean là:
public void ejbCreate (int i) throws ...
phải có một phương thức c r e a te ( ) tương ứng trong giao diện tại chỗ:
public void create (int i) throws ...
Khi đó, ứng dụng khách sẽ thực hiện việc gọi phương thức c r e a t e ( ) trong giao diện tại chỗ và các tham sổ được cung cấp tại đây sẽ được chuyển cho phương thức
e j b C r e a t e ( ) tương ứng.
2.4.3.3 ejbPassivate()
Khi có quá nhiều các thành phần được khởi tạo, bộ chứa EJB có thể thực hiện chuyến một so Session Bean sang trạng thái bị động (trạng thái chờ) để giải phóng tài nguyên của hệ thống. Để thực hiện việc chuyển một Session Bean sang trạng thái bị động, bộ chứa EJB thực hiện việc lưu các Session Bean ra vùng lưu trữ tạm thời nào đó như lưu vào cơ sở dữ liệu hay một tệp dữ liệu. Sau đó, bộ chứa EJB thực hiện việc giải phóng các tài nguyên đang được sử dụng bởi Session Bean này. Ngay trước khi một Session Bean được chuyển sang trạng thái bị động, thì bộ chứa EJB thực hiện việc gọi phương thức e j b P a s s i v a te ( ) .
Các phương thức e jb P c is s iv a te ( ) của lớp Session Bean phải thực hiện việc giải
phóng các tài nguyên mà nó đang chiếm giữ. Ví dụ:
import javax. ejb. *;
public class void MyBean implements SessionBean { public void ejbPassivate() {
<đóng các kết nối mạng, ...>
} }
Phương thức e jb P a s s i v a te ( ) không được áp dụng cho các Session Bean Phi Trạng Thái, bởi các Session Bean này không cần duy trì trạng thái. Chính vì vậy,
- 3 0 -
các Session Bean này chỉ cần thực hiện việc tạo và hủy mà không cần chuyển trạng thái tích cực/bị động.
2.4.3.4 ejbActivate()
Khi một ứng dụng cần sử dụng một Session Bean đang ở trạne thái bị động, thì tiên trình ngược lại được tự động thực hiện: bộ chứa EJB thực hiện việc chuyển Session Bean vào bộ nhớ và kích hoạt Session Bean này. Ngay sau khi Session Bean được kích hoạt, thì phương thức e j b A c t i v a t e ( ) sẽ được gọi bởi bộ chứa EJB.
Lúc này Session Bean đà nằm trong bộ nhớ, phương thức e j b A c t i v a t e ( ) thực hiện việc lấy lại các tài neuyên được giải phóng bởi phương thức e j b P a s s i v a t e ( ) . Ví dụ:
import javax. ejb. *;
public class MyBean implements SessionBean { public void ejbActivate() {
<thiẽt lập các kết nối mạng, ...>
} }
Tương tự như phương thức e jb P a s s i v a t e ( '), phương thức e jb A c t i v a t e ( ) cũng không áp dụng được với các Session Bean Phi Trạng Thái.
2.4.3.5 ejhRemove()
Khi bộ chứa EJB muốn hủy bò một Session Bean nó sẽ thực hiện việc gọi phương thức e jb R e m o v e ( ) . Phương thức e j b R e m o v e ( ) dùng để báo cho Session Bean rằng nó sắp bị hủy bỏ và cho phép nó thực hiện các công tác dọn dẹp nếu cần.
e jb R e m o v e ( ) là phương thức bắt buộc đối với mọi Session Bean. Phương thức này không có tham biến. Vì vậy, chỉ có đúng một phương thức e jb R e m o v e ( ) cho mồi lớp Session Bean. Thông thường, phương thức này thực hiện việc giải phóng các tài nguyên mà Session Bean đang chiếm giữ. Ví dụ:
import javax. ejb. *;
public class MyBean implements SessionBean { public void ejbRemove() {
} }
Bộ chứa EJB có thê gọi phương thức e jb R e m o v e ( ) tại bất kỳ một thời điểm nào kê cả việc bộ chứa EJB quyết định ràng vòng đời của Session Bean đã chấm dứt (ví dụ, có thể do không được truy nhập tới trong một thời gian dài). Nhưng cũng có thể bộ chứa EJB khôna; bao giờ gọi phương thức này. Ví dụ như khi bộ chứa EJB bị sự cô làm ngừng hoạt động của nó. Chính vì vậy, người phát triển ứng dụng phải chủ động phòng chống sự cố này. Ví dụ, các Session Bean thực hiện việc lưu các thông tin tạm thời vào cơ sở dừ liệu thì cần phải có công cụ thực hiện việc dọn dẹp các dữ liệu này.
2.4.3.6 Các ph ương tlí ức kh ác
Ngoài các phương thức được gọi bởi bộ chứa EJB trên các lớp Session Bean, có thế cài đặt các phương thức khác. Các phương thức này thực hiện việc giải quyết các vấn đề đặt ra đổi với Session Bean này. Ví dụ:
import javax. ejb. *;
public class MyBean implements SessionBean { public int add (int I, int j) {
return (i+J);
} }
Đe các ứng dụng khách có thể gọi được các phương thức này thì chúng phải được thể hiện trong giao diện từ xa.
2.4.4 Thực hiện gọi các Session Bean
Phần này sẽ xem xét các ứng dụng khách và việc gọi các phương thức của Session Bean từ các ứng dụng khách này. Các ứng dụng khách có thê tôn tại dưới một trong các dạng sau:
- 32 -
• Ung dụng trên máy trạm thực hiện trao đổi với ở xa Session Bean thông qua mạng.
• Java Applet thực hiện trong một trình duyệt Web trao đổi với Session Bean ở xa thông qua mạng.
• Trên một máy chủ Web thực hiện kết nối với Session Bean ở xa thông qua mạng, người sử dụng dùng trình duyệt Web, kết nối qua mạng đến các thành phần trên bộ chứa Web như Java Server Pages hay Java Servlet. Các thành phân này sẽ thực hiện kết nối với Session Bean.
• Các thành phần EJB khác thực hiện trao đổi để giải quyết các vấn đề lớn hơn.
Tuy ở dạna nào thì thông thường các ứng dụng khác đều thực hiện các công việc
1. Tìm kiếm đối tượng giao diện tại chỗ.
2. Sử dụng đối tượng giao diện tại chỗ để tạo đối tượng Session Bean. 3. Gọi các phương thức của đối tượng Session Bean.
4. Hủy bỏ đối tượng Session Bean. [2]
2.4.4. ĩ Tim kiếm đổi tượng giao diện tại chỗ
Một trong các m ạt tiêu của J2EE là cho phép các ứng dụng có thế “viết một lần, chạy bất cứ đâu”. Vì vậy, mọi ứng dụng Java triển khai ở mức xí nghiệp phải không phụ thuộc vào mô hình đa mức cụ thể nào cả. Việc lự a chọn các thức phân tán các EJB, Servlet, JSP, ... trên nhiều mức khác nhau không làm ảnh hưởng tới việc phát triển các thành phần này. Tính năng này được gọi là tính không phụ thuộc vị trí - vị trí vật lý của các thành phần; khi triển khai không ảnh hưởng tới việc phát triển các thành phần này.
Đe đạt được tính không phụ thuộc vị trí, J2EE sử dụng dịch vụ thư mục và định danh. Dịch vụ thư mục và định danh thực hiện việc lưu trừ các thông tin về các tài
nguyên trong hệ thống cũng như thực hiện các cách thức tìm kiếm các tài nguyên này. Một sô dịch vụ thư mục và định danh truyền thốne có thể kể đến là dịch Netscape Directory Server, Microsoft Active Directory hay IBM Lotus Notes.
Theo cách thức truyền thống, các công ty sử dụng các thư mục để lưu trữ các thông tin như tên người sử dụng, mật khẩu, vị trí của máy tính, máy in, ... Các sản phẩm J2EE sử dụng hệ thống thư mục để lưu trữ thông tin về vị trí của các tài nguyên được sử dụng bởi các ứng dụng khi được triển khai. Các tài nguyên đó có thô kê đến như các giao diện tại chỗ, các thuộc tính môi trường của EJB, trình kết nôi với cơ sở dữ liệu và các tài nguyên khác. Việc sử dụng dịch vụ thư mục cho phép phát triển các ứng dụng mà không phụ thuộc vào một máy tính cụ thể hay một vị trí nào đó. Tính năng này tạo ra khả năng không phụ thuộc vào vị trí của EJB, giúp có thể phát triển các ứng dụng có tính khả chuyển cao. Ví dụ, khi phải thực hiện di chuyển một tài nguyên nào đó tới một vị trí mới thì không cần phải phát triển lại ứng dụng mà thư mục của hệ thống sẽ được cập nhập lại đế phản ánh thay đổi này. Khả năng này giúp làm giảm bớt gánh nặng bảo trì các hệ thống đa mức theo thời gian. Và điều này đặc biệt cần thiết khi sử dụng các thành phần được cung cấp sẵn trên thị trường, bởi thường không thề có được chương trình nguồn của các thành phần này để tiến hành các sửa đổi.
Hệ thống thư mục và định danh được sử dụng trong J2EE là JNDI. JNDI cung cấp cho ứng dụng một giao diện chuẩn cho việc lưu trữ các thông tin về vị trí của người sử dụng, máy tính, mạng, các đối tượng trong hệ thống và các dịch vụ. Trong J2EE, JNDI được sử dụng để định vị các tài nguyên trong môi trường đa mức, trong đó, có thể kể đến như các đối tượng giao diện tại chồ, các thuộc tính môi trường, các tài nguyên của cơ sở dữ liệu, ...
Việc tìm kiếm các tài nguyên trong J2EE được tiến hành theo hai bước:
1. Kết gắn mỗi tài nguyên với một bí danh trong mô tả triển khai. Các sản phâm J2EE sẽ thực hiện việc kết gắn bí danh này với tài nguyên được chỉ định.
- 3 4 -
2. Các ứng dụng khách sử dụng bí danh với JNDI để tìm tài nguyên được triển khai.
Trong các ứng dụng J2EE, tại thời điểm triển khai, các thành phần EJB được kết gan với một bí danh trong mô tả triển khai của thành phần này. Ví dụ, thành phần MyBean được xác định với bí danh MyHome trong mô tả triển khai. Khi đó, bộ chứa EJB sẽ tự động kết gắn bí danh này với giao diện tại chỗ của thành phần EJB. Trong ví dụ trên, MyHome sẽ được kết gắn với đối tượng giao diện tại chồ của thành phần MyBean. Các ứng dụng khách, trên bất cứ máy nào, sẽ sử dụng bí danh