EJB - บริการตั้งเวลา
Timer Service เป็นกลไกที่สามารถสร้างแอปพลิเคชันตามกำหนดเวลาได้ ตัวอย่างเช่นการสร้างสลิปเงินเดือนในวันที่ 1 ของทุกเดือน ข้อกำหนด EJB 3.0 ได้ระบุคำอธิบายประกอบ @Timeout ซึ่งช่วยในการเขียนโปรแกรมบริการ EJB ในถั่วที่ไม่มีสถานะหรือข้อความ EJB Container เรียกเมธอดซึ่งมีคำอธิบายประกอบโดย @Timeout
EJB Timer Service เป็นบริการที่จัดทำโดย EJB container ซึ่งช่วยในการสร้างตัวจับเวลาและกำหนดเวลาโทรกลับเมื่อหมดเวลา
ขั้นตอนในการสร้างตัวจับเวลา
ใส่ SessionContext ใน bean โดยใช้คำอธิบายประกอบ @Resource -
@Stateless
public class TimerSessionBean {
@Resource
private SessionContext context;
...
}
ใช้วัตถุ SessionContext เพื่อรับ TimerService และสร้างตัวจับเวลา เวลาผ่านไปเป็นมิลลิวินาทีและข้อความ
public void createTimer(long duration) {
context.getTimerService().createTimer(duration, "Hello World!");
}
ขั้นตอนในการใช้ตัวตั้งเวลา
ใช้คำอธิบายประกอบ @Timeout กับวิธีการ ประเภทผลตอบแทนควรเป็นโมฆะและส่งผ่านพารามิเตอร์ประเภท Timer เรากำลังยกเลิกตัวจับเวลาหลังจากดำเนินการครั้งแรกมิฉะนั้นจะยังคงทำงานต่อไปหลังจากช่วงเวลาแก้ไข
@Timeout
public void timeOutHandler(Timer timer) {
System.out.println("timeoutHandler : " + timer.getInfo());
timer.cancel();
}
ตัวอย่างการใช้งาน
ให้เราสร้างแอปพลิเคชั่นทดสอบ EJB เพื่อทดสอบ Timer Service ใน EJB
ขั้นตอน | คำอธิบาย |
---|---|
1 | สร้างโครงการที่มีชื่อEjbComponentภายใต้แพคเกจcom.tutorialspoint.timerตามที่อธิบายไว้ในEJB - สร้างแอพลิเคชันบท |
2 | สร้างTimerSessionBean.javaและTimerSessionBeanRemoteตามที่อธิบายไว้ในEJB - สร้างแอพลิเคชันบท เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง |
3 | ทำความสะอาดและสร้างแอปพลิเคชันเพื่อให้แน่ใจว่าตรรกะทางธุรกิจทำงานได้ตามข้อกำหนด |
4 | สุดท้ายปรับใช้แอปพลิเคชันในรูปแบบของไฟล์ jar บน JBoss Application Server เซิร์ฟเวอร์แอปพลิเคชัน JBoss จะเริ่มทำงานโดยอัตโนมัติหากยังไม่เริ่มทำงาน |
5 | ตอนนี้สร้างไคลเอนต์ EJB ซึ่งเป็นแอปพลิเคชันที่ใช้คอนโซลในลักษณะเดียวกับที่อธิบายไว้ในบทEJB - Create Applicationภายใต้หัวข้อCreate Client to access EJB. |
ส่วนประกอบ EJBC (โมดูล 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);
}
ทันทีที่คุณปรับใช้โครงการ EjbComponent บน JBOSS ให้สังเกตบันทึก jboss
JBoss ได้สร้างรายการ JNDI สำหรับถั่วเซสชันของเราโดยอัตโนมัติ - TimerSessionBean/remote.
เราจะใช้สตริงการค้นหานี้เพื่อรับวัตถุทางธุรกิจระยะไกลประเภท - com.tutorialspoint.timer.TimerSessionBeanRemote
เอาต์พุตบันทึกของเซิร์ฟเวอร์แอปพลิเคชัน 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 (ไคลเอนต์ 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
คุณสมบัติเหล่านี้ใช้เพื่อเริ่มต้นอ็อบเจ็กต์ InitialContext ของเซอร์วิสการตั้งชื่อ java
วัตถุ InitialContext จะถูกใช้เพื่อค้นหาเซสชัน bean ที่ไม่มีสถานะ
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 กำลังทำงานต่อไปนี้
โหลดคุณสมบัติจาก jndi.properties และเริ่มต้นอ็อบเจ็กต์ InitialContext
ในเมธอด testTimerService () การค้นหา jndi จะดำเนินการด้วยชื่อ - "TimerSessionBean / remote" เพื่อรับวัตถุทางธุรกิจระยะไกล (timer stateless EJB)
จากนั้นจะเรียก createTimer ผ่าน 2,000 มิลลิวินาทีเป็นเวลาตามกำหนดการ
EJB Container เรียกเมธอด timeoutHandler หลังจาก 2 วินาที
เรียกใช้ไคลเอ็นต์เพื่อเข้าถึง EJB
ค้นหา EJBTester.java ใน project explorer คลิกขวาที่คลาส EJBTester และเลือกrun file.
ตรวจสอบเอาต์พุตต่อไปนี้ในคอนโซล Netbeans
run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)
เอาต์พุตบันทึกของเซิร์ฟเวอร์แอปพลิเคชัน JBoss
คุณสามารถค้นหารายการโทรกลับต่อไปนี้ในบันทึก JBoss
...
11:35:49,555 INFO [STDOUT] timeoutHandler : Hello World!
...