EJB - Đậu không trạng thái
Đậu phiên không trạng thái là một loại đậu doanh nghiệp, thường được sử dụng để thực hiện các hoạt động độc lập. Một bean phiên không trạng thái theo tên của nó không có bất kỳ trạng thái máy khách liên quan nào, nhưng nó có thể giữ nguyên trạng thái phiên bản của nó. EJB Container thường tạo một nhóm các đối tượng bean không trạng thái và sử dụng các đối tượng này để xử lý yêu cầu của khách hàng. Do nhóm, các giá trị biến cá thể không được đảm bảo là giống nhau giữa các lần tra cứu / gọi phương thức.
Các bước tạo EJB không trạng thái
Sau đây là các bước cần thiết để tạo một EJB không trạng thái:
Tạo giao diện từ xa / cục bộ hiển thị các phương pháp kinh doanh.
Giao diện này sẽ được sử dụng bởi ứng dụng khách EJB.
Sử dụng chú thích @Local, nếu ứng dụng khách EJB ở trong cùng một môi trường nơi đậu phiên EJB sẽ được triển khai.
Sử dụng chú thích @Remote, nếu ứng dụng khách EJB ở trong môi trường khác nơi đậu phiên EJB sẽ được triển khai.
Tạo một bean phiên không trạng thái, thực hiện giao diện trên.
Sử dụng chú thích @Stateless để biểu thị nó là một bean không trạng thái. EJB Container tự động tạo các cấu hình hoặc giao diện liên quan được yêu cầu bằng cách đọc chú thích này trong quá trình triển khai.
Giao diện từ xa
import javax.ejb.Remote;
@Remote
public interface LibrarySessionBeanRemote {
//add business method declarations
}
EJB không trạng thái
@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {
//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ươc | Sự miêu tả |
---|---|
1 | Tạo một dự án với tên EjbComponent trong một gói com.tutorialspoint.stateless 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 không trạng thái. |
2 | Tạo LibrarySessionBean.java và LibrarySessionBeanRemote 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ờ tạo ứng dụng khách 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)
LibrarySessionBeanRemote.java
package com.tutorialspoint.stateless;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface LibrarySessionBeanRemote {
void addBook(String bookName);
List getBooks();
}
LibrarySessionBean.java
package com.tutorialspoint.stateless;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {
List<String> bookShelf;
public LibrarySessionBean() {
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 - LibrarySessionBean/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.stateless.LibrarySessionBeanRemote
Đầ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:
LibrarySessionBean/remote - EJB3.x Default Remote Business Interface
LibrarySessionBean/remote-com.tutorialspoint.stateless.LibrarySessionBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibrarySessionBean,service=EJB3
16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.stateless.LibrarySessionBeanRemote ejbName: LibrarySessionBean
16:30:02,731 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibrarySessionBean/remote - EJB3.x Default Remote Business Interface
LibrarySessionBean/remote-com.tutorialspoint.stateless.LibrarySessionBeanRemote - 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.LibrarySessionBeanRemote;
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.testStatelessEjb();
}
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 testStatelessEjb() {
try {
int choice = 1;
LibrarySessionBeanRemote libraryBean =
LibrarySessionBeanRemote)ctx.lookup("LibrarySessionBean/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++;
}
LibrarySessionBeanRemote libraryBean1 =
(LibrarySessionBeanRemote)ctx.lookup("LibrarySessionBean/remote");
List<String> booksList1 = libraryBean1.getBooks();
System.out.println(
"***Using second lookup to get library stateless object***");
System.out.println(
"Book(s) entered so far: " + booksList1.size());
for (int i = 0; i < booksList1.size(); ++i) {
System.out.println((i+1)+". " + booksList1.get(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 testStatelessEjb (), việc tra cứu jndi được thực hiện với tên - "LibrarySessionBean / 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 sự 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.
Sau đó, một tra cứu jndi khác được thực hiện với tên - "LibrarySessionBean / remote" để lấy lại đối tượng nghiệp vụ từ xa (EJB không trạng thái) và liệt kê các cuốn sách được thực hiện.
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
***Using second lookup to get library stateless object***
Book(s) entered so far: 0
BUILD SUCCESSFUL (total time: 13 seconds)
Chạy lại ứ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: 2
Book(s) entered so far: 0
***Using second lookup to get library stateless object***
Book(s) entered so far: 1
1. Learn Java
BUILD SUCCESSFUL (total time: 12 seconds)
Đầu ra hiển thị ở trên có thể khác nhau, tùy thuộc vào số lượng đối tượng EJB không trạng thái mà JBoss đang duy trì.
Trong trường hợp, một đối tượng EJB không trạng thái được duy trì, bạn có thể thấy cùng một danh sách sách sau mỗi lần tra cứu.
EJB Container có thể trả về cùng một đối tượng EJB không trạng thái cho mọi lần tra cứu.
Bean EJB không trạng thái đang giữ giá trị của biến cá thể cho đến khi máy chủ không được khởi động lại.