Учебники

EJB — Таймер Сервис

Служба таймера — это механизм, с помощью которого можно построить запланированное приложение. Например, формирование зарплатной квитанции 1-го числа каждого месяца. В спецификации EJB 3.0 указана аннотация @Timeout, которая помогает при программировании службы EJB в компоненте, не поддерживающем состояние или управляемом сообщениями. EJB Container вызывает метод, который аннотируется @Timeout.

Служба таймера EJB — это служба, предоставляемая контейнером EJB, которая помогает создавать таймер и планировать обратный вызов по истечении таймера.

Шаги по созданию таймера

Внедрить 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 для метода. Возвращаемый тип должен быть void и передавать параметр типа Timer. Мы отменяем таймер после первого выполнения, иначе он продолжит работать через фиксированные интервалы.

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

Пример приложения

Давайте создадим тестовое приложение EJB для тестирования службы таймера в EJB.

шаг Описание
1

Создайте проект с именем EjbComponent в пакете com.tutorialspoint.timer, как описано в главе EJB — Создание приложения .

2

Создайте TimerSessionBean.java и TimerSessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений.

3

Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.

4

Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.

5

Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» .

Создайте проект с именем EjbComponent в пакете com.tutorialspoint.timer, как описано в главе EJB — Создание приложения .

Создайте TimerSessionBean.java и TimerSessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений.

Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.

Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.

Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» .

EJBComponent (модуль 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

Как только вы развернете проект 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 будет использоваться для поиска сессионного компонента без сохранения состояния.

Эти свойства используются для инициализации объекта InitialContext сервиса именования java.

Объект InitialContext будет использоваться для поиска сессионного компонента без сохранения состояния.

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» для получения удаленного бизнес-объекта (таймера без сохранения состояния EJB).

  • Затем createTimer вызывается, передавая 2000 миллисекунд как время по расписанию.

  • Контейнер EJB вызывает метод timeoutHandler через 2 секунды.

Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.

В методе testTimerService () поиск jndi выполняется с именем — «TimerSessionBean / remote» для получения удаленного бизнес-объекта (таймера без сохранения состояния EJB).

Затем createTimer вызывается, передавая 2000 миллисекунд как время по расписанию.

Контейнер EJB вызывает метод timeoutHandler через 2 секунды.

Запустите клиент для доступа к EJB

Найдите EJBTester.java в проводнике проекта. Щелкните правой кнопкой мыши класс EJBTester и выберите файл запуска .

Проверьте следующий вывод в консоли Netbeans.

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

Вывод журнала сервера приложений JBoss

Вы можете найти следующие записи обратного вызова в журнале JBoss