EJB - Dịch vụ hẹn giờ

Dịch vụ hẹn giờ là một cơ chế mà ứng dụng đã lên lịch có thể được xây dựng. Ví dụ, phát sinh phiếu lương vào ngày 1 hàng tháng. Đặc tả EJB 3.0 đã chỉ định chú thích @Timeout, giúp lập trình dịch vụ EJB trong một bean không trạng thái hoặc được điều khiển bằng tin nhắn. EJB Container gọi phương thức, được chú thích bởi @Timeout.

EJB Timer Service là một dịch vụ được cung cấp bởi EJB container, giúp tạo bộ đếm thời gian và lên lịch gọi lại khi bộ hẹn giờ hết hạn.

Các bước tạo bộ hẹn giờ

Đưa SessionContext vào bean bằng cách sử dụng chú thích @Resource -

@Stateless
public class TimerSessionBean {

   @Resource
   private SessionContext context;
   ...
}

Sử dụng đối tượng SessionContext để lấy TimerService và tạo bộ đếm thời gian. Thời gian tính bằng mili giây và tin nhắn.

public void createTimer(long duration) {
   context.getTimerService().createTimer(duration, "Hello World!");
}

Các bước sử dụng hẹn giờ

Sử dụng chú thích @Timeout cho một phương thức. Kiểu trả về phải là void và truyền một tham số kiểu Timer. Chúng tôi sẽ hủy bộ hẹn giờ sau lần thực hiện đầu tiên, nếu không nó sẽ tiếp tục chạy sau khoảng thời gian khắc phục.

@Timeout
public void timeOutHandler(Timer timer) {
   System.out.println("timeoutHandler : " + timer.getInfo());        
   timer.cancel();
}

Ứng dụng mẫu

Hãy để chúng tôi tạo một ứng dụng EJB thử nghiệm để thử nghiệm Dịch vụ hẹn giờ trong EJB.

Bươc Sự miêu tả
1

Tạo một dự án với tên EjbComponent trong gói com.tutorialspoint.timer như được giải thích trong chương EJB - Tạo ứng dụng .

2

Tạo TimerSessionBean.javaTimerSessionBeanRemote 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)

TimerSessionBean.java

package com.tutorialspoint.timer;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Timer;
import javax.ejb.Stateless;
import javax.ejb.Timeout;

@Stateless
public class TimerSessionBean implements TimerSessionBeanRemote {

   @Resource
   private SessionContext context;

   public void createTimer(long duration) {
      context.getTimerService().createTimer(duration, "Hello World!");
   }

   @Timeout
   public void timeOutHandler(Timer timer) {
      System.out.println("timeoutHandler : " + timer.getInfo());        
      timer.cancel();
   }
}

TimerSessionBeanRemote.java

package com.tutorialspoint.timer;

import javax.ejb.Remote;

@Remote
public interface TimerSessionBeanRemote {
   public void createTimer(long milliseconds);
}
  • 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 - TimerSessionBean/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.timer.TimerSessionBeanRemote

Đầ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:
   TimerSessionBean/remote - EJB3.x Default Remote Business Interface
   TimerSessionBean/remote-com.tutorialspoint.timer.TimerSessionBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=TimerSessionBean,service=EJB3
16:30:02,723 INFO  [EJBContainer] STARTED EJB: com.tutorialspoint.timer.TimerSessionBeanRemote ejbName: TimerSessionBean
...

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.TimerSessionBeanRemote;
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.testTimerService();
   }
   
   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 testTimerService() {
      try {
         TimerSessionBeanRemote timerServiceBean = (TimerSessionBeanRemote)ctx.lookup("TimerSessionBean/remote");

         System.out.println("["+(new Date()).toString()+ "]" + "timer created.");
         timerServiceBean.createTimer(2000);            

      } catch (NamingException ex) {
         ex.printStackTrace();
      }
   }
}

EJBTester đang thực hiện các nhiệm 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 testTimerService (), tra cứu jndi được thực hiện với tên - "TimerSessionBean / remote" để lấy đối tượng nghiệp vụ từ xa (timer stateless EJB).

  • Sau đó, createTimer được gọi vượt qua 2000 mili giây dưới dạng thời gian lịch trình.

  • EJB Container gọi phương thức timeoutHandler sau 2 giây.

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:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)

Đầu ra nhật ký máy chủ ứng dụng JBoss

Bạn có thể tìm thấy các mục gọi lại sau trong nhật ký JBoss

...
11:35:49,555 INFO  [STDOUT] timeoutHandler : Hello World!
...