EJB - Zamanlayıcı Hizmeti

Zamanlayıcı Hizmeti, programlanmış uygulamanın oluşturulabileceği bir mekanizmadır. Örneğin, her ayın 1'inde maaş bordrosu oluşturma. EJB 3.0 spesifikasyonu, EJB hizmetinin durum bilgisi olmayan veya mesajla çalışan bir bean'da programlanmasına yardımcı olan @Timeout ek açıklamasını belirtmiştir. EJB Container, @Timeout tarafından açıklanan yöntemi çağırır.

EJB Zamanlayıcı Hizmeti, zamanlayıcı oluşturmaya ve zamanlayıcı sona erdiğinde geri aramayı programlamaya yardımcı olan EJB kapsayıcısı tarafından sağlanan bir hizmettir.

Zamanlayıcı Oluşturma Adımları

@Resource annotation kullanarak SessionContext'i bean'e enjekte edin -

@Stateless
public class TimerSessionBean {

   @Resource
   private SessionContext context;
   ...
}

TimerService'i almak ve zamanlayıcı oluşturmak için SessionContext nesnesini kullanın. Milisaniye cinsinden zaman ve mesaj geçirin.

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

Zamanlayıcıyı Kullanma Adımları

Bir yöntem için @Timeout ek açıklamasını kullanın. Dönüş türü geçersiz olmalı ve Timer türünde bir parametre iletmelidir. Zamanlayıcıyı ilk çalıştırmadan sonra iptal ediyoruz, aksi takdirde düzeltme aralıklarından sonra çalışmaya devam edecektir.

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

Örnek Uygulama

EJB'de Timer Service'i test etmek için bir test EJB uygulaması oluşturalım.

Adım Açıklama
1

EJB - Uygulama Oluştur bölümünde açıklandığı gibi com.tutorialspoint.timer paketinin altında EjbComponent adlı bir proje oluşturun .

2

Oluşturma TimerSessionBean.java ve TimerSessionBeanRemote açıklandığı şekilde EJB - Uygulama oluşturun bölüm. Geri kalan dosyaları değiştirmeden tutun.

3

İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun.

4

Son olarak, uygulamayı JBoss Uygulama Sunucusunda jar dosyası biçiminde dağıtın. Henüz başlatılmamışsa JBoss Uygulama sunucusu otomatik olarak başlayacaktır.

5

Şimdi, başlık altındaki EJB - Uygulama Oluştur bölümünde açıklandığı gibi, konsol tabanlı bir uygulama olan EJB istemcisini oluşturun.Create Client to access EJB.

EJBComponent (EJB Modülü)

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 projesini JBOSS üzerinde dağıtır dağıtmaz, jboss günlüğüne dikkat edin.

  • JBoss, oturum fasulyemiz için otomatik olarak bir JNDI girişi oluşturdu - TimerSessionBean/remote.

  • Bu arama dizesini, türündeki uzak iş nesnesini elde etmek için kullanacağız - com.tutorialspoint.timer.TimerSessionBeanRemote

JBoss Uygulama Sunucusu Günlük Çıktısı

...
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 İstemcisi)

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
  • Bu özellikler, java adlandırma hizmetinin InitialContext nesnesini başlatmak için kullanılır.

  • InitialContext nesnesi, durum bilgisiz oturum çekirdeğini aramak için kullanılacaktır.

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 aşağıdaki görevleri yapmaktadır.

  • Jndi.properties dosyasından özellikleri yükleyin ve InitialContext nesnesini başlatın.

  • TestTimerService () yönteminde, jndi araması, uzak iş nesnesini (zamanlayıcı durumsuz EJB) elde etmek için "TimerSessionBean / remote" adıyla yapılır.

  • Ardından, zamanlama zamanı olarak 2000 milisaniyeyi geçerek createTimer çağrılır.

  • EJB Container, 2 saniye sonra timeoutHandler yöntemini çağırır.

EJB'ye Erişmek için İstemciyi Çalıştırın

Proje gezgininde EJBTester.java'yı bulun. EJBTester sınıfına sağ tıklayın ve seçinrun file.

Netbeans konsolunda aşağıdaki çıktıyı doğrulayın.

run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)

JBoss Uygulama Sunucusu Günlük Çıktısı

Aşağıdaki geri arama girişlerini JBoss günlüğünde bulabilirsiniz

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