EJB - Máy đánh chặn
EJB 3.0 cung cấp đặc điểm kỹ thuật để chặn các cuộc gọi phương thức nghiệp vụ bằng cách sử dụng các phương thức được chú thích bằng chú thích @AroundInvoke. Một phương thức chặn được gọi bởi ejbContainer trước khi phương thức nghiệp vụ gọi nó là chặn. Sau đây là ví dụ về chữ ký của một phương pháp đánh chặn
@AroundInvoke
public Object methodInterceptor(InvocationContext ctx) throws Exception {
System.out.println("*** Intercepting call to LibraryBean method: "
+ ctx.getMethod().getName());
return ctx.proceed();
}
Các phương pháp đánh chặn có thể được áp dụng hoặc bị ràng buộc ở ba cấp độ.
Default - Bộ đánh chặn mặc định được gọi cho mỗi bean trong quá trình triển khai. Bộ đánh chặn mặc định chỉ có thể được áp dụng qua xml (ejb-jar.xml).
Class- Bộ đánh chặn mức lớp được gọi cho mọi phương thức của bean. Có thể áp dụng trình đánh chặn cấp lớp bằng chú thích của via xml (ejb-jar.xml).
Method- Bộ đánh chặn mức phương thức được gọi cho một phương thức cụ thể của bean. Có thể áp dụng trình đánh chặn mức phương pháp bằng cách sử dụng chú thích qua xml (ejb-jar.xml).
Chúng tôi đang thảo luận về bộ đánh chặn cấp độ Class ở đây.
Lớp đánh chặn
package com.tutorialspoint.interceptor;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class BusinessInterceptor {
@AroundInvoke
public Object methodInterceptor(InvocationContext ctx) throws Exception {
System.out.println("*** Intercepting call to LibraryBean method: "
+ ctx.getMethod().getName());
return ctx.proceed();
}
}
Giao diện từ xa
import javax.ejb.Remote;
@Remote
public interface LibraryBeanRemote {
//add business method declarations
}
EJB không trạng thái bị chặn
@Interceptors ({BusinessInterceptor.class})
@Stateless
public class LibraryBean implements LibraryBeanRemote {
//implement business method
}
Ứng dụng mẫu
Hãy để chúng tôi tạo một ứng dụng EJB thử nghiệm để kiểm tra EJB không trạng thái bị chặn.
Bươc | Sự miêu tả |
---|---|
1 | Tạo một dự án với tên EjbComponent dưới một gói com.tutorialspoint.interceptor như được giải thích trong chương EJB - Tạo ứng dụng . Bạn cũng có thể sử dụng dự án được tạo trong chương EJB - Tạo ứng dụng như vậy cho chương này để hiểu các khái niệm EJB bị chặn. |
2 | Tạo LibraryBean.java và LibraryBeanRemote trong gói com.tutorialspoint.interceptor như được giải thích trong chương EJB - Tạo ứng dụng . Giữ phần còn lại của các tệp không thay đổi. |
3 | Làm sạch và xây dựng ứng dụng để đảm bảo logic nghiệp vụ đang hoạt động theo yêu cầu. |
4 | Cuối cùng, triển khai ứng dụng dưới dạng tệp jar trên Máy chủ ứng dụng JBoss. Máy chủ ứng dụng JBoss sẽ tự động khởi động nếu nó chưa được khởi động. |
5 | Bây giờ, hãy tạo ứng dụng ejb, một ứng dụng dựa trên bảng điều khiển theo cách tương tự như đã giải thích trong chương EJB - Tạo ứng dụng theo chủ đềCreate Client to access EJB. |
EJBComponent (Mô-đun EJB)
LibraryBeanRemote.java
package com.tutorialspoint.interceptor;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface LibraryBeanRemote {
void addBook(String bookName);
List getBooks();
}
LibraryBean.java
package com.tutorialspoint.interceptor;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Interceptors ({BusinessInterceptor.class})
@Stateless
public class LibraryBean implements LibraryBeanRemote {
List<String> bookShelf;
public LibraryBean() {
bookShelf = new ArrayList<String>();
}
public void addBook(String bookName) {
bookShelf.add(bookName);
}
public List<String> getBooks() {
return bookShelf;
}
}
Ngay sau khi bạn triển khai dự án EjbComponent trên JBOSS, hãy để ý nhật ký jboss.
JBoss đã tự động tạo một mục nhập JNDI cho bean phiên của chúng tôi - LibraryBean/remote.
Chúng tôi sẽ sử dụng chuỗi tra cứu này để lấy đối tượng nghiệp vụ từ xa thuộc loại - com.tutorialspoint.interceptor.LibraryBeanRemote
Đầu ra nhật ký máy chủ ứng dụng JBoss
...
16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibraryBean/remote - EJB3.x Default Remote Business Interface
LibraryBean/remote-com.tutorialspoint.interceptor.LibraryBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryBean,service=EJB3
16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.interceptor.LibraryBeanRemote ejbName: LibraryBean
16:30:02,731 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibraryBean/remote - EJB3.x Default Remote Business Interface
LibraryBean/remote-com.tutorialspoint.interceptor.LibraryBeanRemote - EJB3.x Remote Business Interface
...
EJBTester (Khách hàng EJB)
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
Các thuộc tính này được sử dụng để khởi tạo đối tượng InitialContext của dịch vụ đặt tên java.
Đối tượng InitialContext sẽ được sử dụng để tra cứu bean phiên không trạng thái.
EJBTester.java
package com.tutorialspoint.test;
import com.tutorialspoint.stateful.LibraryBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBTester {
BufferedReader brConsoleReader = null;
Properties props;
InitialContext ctx;
{
props = new Properties();
try {
props.load(new FileInputStream("jndi.properties"));
} catch (IOException ex) {
ex.printStackTrace();
}
try {
ctx = new InitialContext(props);
} catch (NamingException ex) {
ex.printStackTrace();
}
brConsoleReader =
new BufferedReader(new InputStreamReader(System.in));
}
public static void main(String[] args) {
EJBTester ejbTester = new EJBTester();
ejbTester.testInterceptedEjb();
}
private void showGUI() {
System.out.println("**********************");
System.out.println("Welcome to Book Store");
System.out.println("**********************");
System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
}
private void testInterceptedEjb() {
try {
int choice = 1;
LibraryBeanRemote libraryBean =
LibraryBeanRemote)ctx.lookup("LibraryBean/remote");
while (choice != 2) {
String bookName;
showGUI();
String strChoice = brConsoleReader.readLine();
choice = Integer.parseInt(strChoice);
if (choice == 1) {
System.out.print("Enter book name: ");
bookName = brConsoleReader.readLine();
Book book = new Book();
book.setName(bookName);
libraryBean.addBook(book);
} else if (choice == 2) {
break;
}
}
List<Book> booksList = libraryBean.getBooks();
System.out.println("Book(s) entered so far: " + booksList.size());
int i = 0;
for (Book book:booksList) {
System.out.println((i+1)+". " + book.getName());
i++;
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}finally {
try {
if(brConsoleReader !=null) {
brConsoleReader.close();
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
}
EJBTester thực hiện các tác vụ sau:
Tải các thuộc tính từ jndi.properties và khởi tạo đối tượng InitialContext.
Trong phương thức testInterceptedEjb (), tra cứu jndi được thực hiện với tên - "LibraryBean / remote" để lấy đối tượng nghiệp vụ từ xa (stateless EJB).
Sau đó, người dùng được hiển thị một cửa hàng thư viện Giao diện Người dùng và họ được yêu cầu nhập một lựa chọn.
Nếu người dùng nhập 1, hệ thống sẽ hỏi tên sách và lưu sách bằng phương thức addBook () phiên đậu không trạng thái. Session Bean đang lưu trữ sách trong biến thể hiện của nó.
Nếu người dùng nhập 2, hệ thống sẽ truy xuất sách bằng phương thức getBooks () của phiên đậu không trạng thái và thoát.
Chạy ứng dụng khách để truy cập EJB
Định vị EJBTester.java trong trình khám phá dự án. Nhấp chuột phải vào lớp EJBTester và chọnrun file.
Xác minh kết quả sau trong bảng điều khiển Netbeans.
run:
**********************
Welcome to Book Store
**********************
Options
1. Add Book
2. Exit
Enter Choice: 1
Enter book name: Learn Java
**********************
Welcome to Book Store
**********************
Options
1. Add Book
2. Exit
Enter Choice: 2
Book(s) entered so far: 1
1. Learn Java
BUILD SUCCESSFUL (total time: 13 seconds)
Đầu ra nhật ký máy chủ ứng dụng JBoss
Xác minh đầu ra sau trong đầu ra nhật ký máy chủ ứng dụng JBoss.
....
09:55:40,741 INFO [STDOUT] *** Intercepting call to LibraryBean method: addBook
09:55:43,661 INFO [STDOUT] *** Intercepting call to LibraryBean method: getBooks