Transcript

EJBIntroduction & Session Bean

Đào Anh Tuấn – datuan@fit.hcmuns.edu.vn

EJB Introdution – Định nghĩa

•Enterprise JavaBeans (EJB) is a platform for building portable, reusable, and scalable business applications using the Java programming language.

•From a developer’s point of view, an EJB is a piece of Java code that executes in a specialized runtime environment called the EJB container, which provides a number of component services

• Reusable: For example, you can implement the credit card–charging module as an EJB component that may be accessed by multiple applications

• Main strength: Multithreading

Các dịch vụ EJB hỗ trợ

Vai trò EJB trong mô hình layers

Vị trí của EJB

EJB Types:

•Consists of three types:▫Session Beans▫Message-Driven Beans▫Entity Beans

•Trong đó Session và Message-Driven Beans đảm nhiệm vai trò ở tầng Business, Entity Beans đảm nhiệm vai trò ở tầng Persistence

J2EE Container• EJB chỉ có thể thực thi trong các EJB Container• J2EE container cung cấp cho người dùng nhiều dịch vụ cao cấp

khác nhau• Trong phạm vi môn học: Sử dụng server JBoss

Bussiness Logic with Session Bean• Một ứng dụng thường bao gồm rất nhiều nghiệp vụ:

Kiểm tra tài khoản, rút tiền, xuất hóa đơn …• Session Bean đóng vai trò cài đặt các chức năng nghiệp

vụ cho ứng dụng.• Nói một cách đơn giản: Session bean bao gồm một tập

các hàm cho phép client truy xuất để hoàn thành một công việc nào đó.

• Các client có thể là một desktop application, jsp/servlet hoặc có thể là một ứng dụng .NET truy xuất theo cơ chế web service

• Các hàm của session bean có thể được truy xuất từ xa, không nhất thiết phải nằm trên máy cục bộ -> ứng dụng phân tán (distributed)

Advantages:

Một số điểm mạnh khi dùng session bean:•concurrency and thread safety: có thể xử lý

nhiều client cùng lúc mà không cài đặt các cơ chế đặc biệt (do container quản lý)

• remote invocation: có thể được triệu gọi từ xa• transaction and security management

Cấu trúc một session bean:

•Gồm 2 phần: Bean interfaces và bean implementation class.

•Client không được phép truy xuất trực tiếp đến implementation class mà phải truy xuất thông qua interface.

• Interface sẽ triệu gọi hàm tương ứng của implemtation class và trả kết quả cho client.

Ví dụ

•Hình ảnh một session bean hỗ trợ người dùng tham gia đấu giá: gồm 2 phần▫ interface▫ implementation class

Phân loại Session Bean

•Chia làm 2 loại:▫Stateless: Không lưu trữ bất kỳ thông tin nào từ

phía client▫Stateful: Lưu giữ thông tin (hay còn gọi là state)

của client

Ví dụ minh họa

•Xây dựng một stateless session bean hỗ trợ việc cộng hai số lớp (vài trăm chữ số - lớp BigInteger trong Java)

•Hàm cung cấp cho user triệu gọi từ xa có dạngBigInteger add (BigInteger a, BigInteger b)

Xây dựng Interface

•Có 3 loại interface:▫Local: Client và Bean nằm trên cùng một JVM▫Remote: Client có thể nằm ở xa Bean (khác máy

tính)▫Web Service: Triệu gọi theo cơ chế web service

•Khai báo các hàm “cam kết” sẽ hỗ trợ cho user

Ví dụ về remote service

•Sử dụng annotation @Remote (nếu là local interface sẽ sử dụng @Local)

•Chỉ khai báo hàm

import java.math.BigInteger;import javax.ejb.Remote;@Remotepublic interface AdderRemote {

BigInteger add(BigInteger a, BigInteger b); }

Local Interface:

•Cũng chỉ khai báo hàm

import java.math.BigInteger;import javax.ejb.Local;

@Localpublic interface AdderLocal {

BigInteger add(BigInteger a, BigInteger b); }

Stateless Bean class:

•Là nơi cài đặt hàm cụ thể:

•@Stateless• Implements các

interface(s)•Một session bean

có thể chọn chỉ có remote/local interface hoặc cả 2.

import javax.ejb.Stateless;

@Statelesspublic class AdderBean implements AdderRemote, AdderLocal {

public BigInteger add(BigInteger a, BigInteger b) { return a.add(b); } }

Life Cycle

•Stateless: Do không lưu trữ thông tin của client, một stateless session bean có thể phục vụ bất kỳ client nào.

•Container tạo sẵn một số instance và đặt trong POOL

•Số lượng beans có thể ít hơn số client

Lifecycle - Stateless•Stateless beans chỉ có 3 trạng

thái:•Bean chưa được tạo ra•Container tạo ra các beans và

đặt vào pool (idle beans)•Khi có 1 client triệu gọi, lấy

bean ra khỏi pool, thực thi lệnh (busy)

•Nếu client không có nhu cầu sử dụng -> trở về pool (idle)

Các hàm callback

•Có 2 trường hợp đặc biệt:•Hàm cần gọi sau khi bean vừa được khởi tạo:

Dùng ký hiệu @PostConstruct trước khai báo hàm

•Hàm cần gọi trước khi bean được hủy: Dùng ký hiệu @PreDestroy trước khai báo hàm

•Khi không có nhu cầu sử dụng, các beans được đặt trong POOL. Số lượng beans trong POOL sẽ được Container duy trì ở mức hợp lý

Ví dụ

Life Cycle – Stateful Session Beans

• Mỗi khi có 1 client triệu gọi, sẽ phải phát sinh một session bean ứng với client đó.

Các chứng năng phát sinh•Passivation: Khi số lượng beans quá nhiều,

container có nhu cầu cất các beans ứng với các client đã lâu không liên lạc lại với container vào đĩa cứng

•Activation: Khi các client này liên lạc lại với container, phải phục hồi bean từ đĩa cứng trở lại bộ nhớ

•Remove: Khi client ngắt hoàn toàn liên lạc với container, hủy session bean ứng với client đó vì không thể sử dụng lại.

Các hàm callback

•@PostConstruct•@PreDestroy•@PrePassivate•@PostActivate•@Remove (không phải hàm call back): khi gọi

hàm được đánh dấu remove, client báo cho container biết mình không có nhu cầu sử dụng nữa và bean sẽ bị hủy.

Các luật:

•a session bean must have at least one business interface

•The session bean class must be concrete. You cannot define a session

bean class as either final or abstract since the container needs to

manipulate it.

•You must have a no-argument constructor in the bean class

•Business method names must not start with “ejb.”

•You must define all business methods as public, but not final or static

•If you are exposing a method in a remote business interface of the EJB,

then make sure that the arguments and the return type of the method

implement the java.io.Serializable interface

Xây dựng client

•Gọi session bean từ servlet:Các bước:•Sử dụng JNDI để lookup Session bean Interface•Gọi hàm của bean Interface•Container sẽ tự động gọi hàm tương ứng của

bean class. Client không bao giờ tiếp xúc trực tiếp với bean class

Ví dụ:

•Quá trình lookup: Mặc định chuỗi lookup làBeanName/remote hoặc BeanName/local

try { Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.put(Context.PROVIDER_URL, "localhost:1099"); Context ctx = new InitialContext(properties); AdderLocal test=(AdderLocal)ctx.lookup("AdderBean/local");

Lưu ý:

• Import các gói cần thiết• Import package chứa các interface của ejb

import java.util.*;import javax.naming.*;import ejb.*;

Gọi hàm từ interface

Context ctx = new InitialContext(properties); AdderLocal test=(AdderLocal)ctx.lookup("AdderBean/local"); BigInteger a=new BigInteger("12345");BigInteger b=new BigInteger("56576");BigInteger c=test.add(a,b);out.println("c="+c);

top related