Friday, July 12, 2013

EJB Timer Service API

Timer Service API.


Timer Service ის გამოსაყენებლად იმპლემენტაცია უნდა გავუკეთოთ javax.ejb.TimedObject ინტერფეისს, რომელშიც აღწერილია ქოლბექ მეთოდი ejbTimeout( ):


public interface TimedObject {
public void ejbTimeout(Timer timer) ;
}
view raw gistfile1.java hosted with ❤ by GitHub

EJB  ში შეგვიძლია @javax.ejb.Timeout ანოტაციაც დავადოთ მეთოდს, რომელიც voidს აბრუნებს, და ექნება  javax.ejb.Timer პარამეტრი.
აქვე ორივეს ვნახავთ

@Stateless
public class Example1 implements javax.ejb.TimedObject {
public void ejbTimeout(javax.ejb.Timer timer) {
// ბიზნეს ლოგიკა
}
}
view raw gistfile1.java hosted with ❤ by GitHub

ალტერნატივა  არი @javax.ejb.Timeout ანოტაცია:

@Stateless
public class Example2{
@Timeout
public void maintenance(javax.ejb.Timer timer) {
// ბიზნეს ლოგიკა აქ
}
}
view raw gistfile1.java hosted with ❤ by GitHub

}


იმისათვის რომ დავარეგისტრიროთ ბინი  დროის პერიოდში TimerService –ს ვიყენებთ. TimerService შეგვიძლია inject გავუკეთოთ @javax.annotation.Resource ით ან EJBContext იდან წამოვიღოთ.


ანუ ეს ორი ვარიანტი გვაქვს:
@Resourceprivate SessionContext ctx; ctx.getTimerService();
@Resource javax.ejb.TimerService timerService;


მაგალითად დარეგისტრირებისთვის შევქმნათ  CalendarTimer, ან შეგვილია პირდაპირ IntervalTimer, ანაც SingleActionTimer იც აქვს. დეტალურად API ში შეგიძლიათ ნახოთ, რა რას აკეთებს, აქ რო არ დავწყო მე პოემების წერა. აგერ ლინკიც:  http://docs.oracle.com/javaee/6/api/javax/ejb/TimerService.html  -  Just Google :-)



ტაიმერის წაშლაც ადვილადაა შესაძლებელი, პირდაპირ cancell() მეთოდი აქვს.


აგერ ერთი მაგალითიც  CalendarTimer–ის.


@Resource
private TimerService timerService;
private ScheduleExpression expression;
private TimerConfig timerConfig;
@Override
public void setUpTimer() {
LOG.info("cleans all timer settings");
if (timerService.getTimers() != null) {
for (Timer timer : timerService.getTimers()) {
timer.cancel();
}
}
String nextTime=TimerConfUtils.getTimerInterval();
expression = new ScheduleExpression().dayOfWeek("*").hour("*").minute("*").second(nextTime);
timerConfig = new TimerConfig();
timerConfig.setPersistent(true);
timerConfig.setInfo(TIMER_NAME);
timerService.createCalendarTimer(expression, timerConfig);
}
view raw gistfile1.java hosted with ❤ by GitHub

მოლკედ მთავარი მუღამი ისაა, რომ თუ სერვერი დარესტარტდება ან რამე მაგდაგვარი, ტაიმერრი თავის დროს მაინც გააგრძელებს მუშაობას. ანუ რომ შეხვიდეთ Jboss ის ფოლდერში, მაგალითად : /usr/jboss/standalone/data/timer-service-data ფოლდერში
მანდ ნახავთ თქვენს ობიექტებს ტაიმერისას.

რაც შეეხება EJB 3.1 აქ უკვე არის @Schedule ანოტაცია. ძალიან მარტიავად


@Singleton
public class TimerService {
@EJB
private CryptoDaoLocal cryptoDao;
@Schedule(second="*/1", minute="*",hour="*", persistent=false)
public void doWork(){
LOG.log(CryptoDaoLocal.generateKeys());
}
}
view raw gistfile1.java hosted with ❤ by GitHub

აგერ XML ითაც შეგვიძლია გავაკეთოთ იგივე @Schedule რომ არ ვწეროთ:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
<enterprise-beans>
<session>
<ejb-name>ClealTemporaryFile</ejb-name>
<ejb-class>ge.embedded.signer.schedule.ClealTemporaryFile</ejb-class>
<session-type>Stateless</session-type>
<timer>
<schedule>
<minute>*/30</minute>
<hour>*</hour>
<month>*</month>
<year>*</year>
</schedule>
<timeout-method>
<method-name>ServiceTask</method-name>
</timeout-method>
</timer>
</session>
</enterprise-beans>
</ejb-jar>
view raw gistfile1.xml hosted with ❤ by GitHub

ეს XML კი META-INF ში ჩავაგდოდ – Deployს მერე jar ის META_INF ში ჩახტება;



2 comments:

  1. როდესაც ჯობის გამოყენება გინდა მაშინ უნდა გამოიყენო ეს მეთოდი როგორც ვხვდები.
    ჯობების შესაქმნელად კარგი და მარტივი არის MessageDrivenBean ების გამოყენაბა. კლასს აწერ თავზე ანოტაციას და ეს კლასი იმპლემენტაციას უკეთებს (Quartz შედულერის) Job ინტერფეისს.

    @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "cronTrigger", propertyValue = "0/10 * * * * ?") })
    @ResourceAdapter("quartz-ra.rar")
    public class TestJob implements StatefulJob{

    public void execute(JobExecutionContext arg0) {

    //logika
    }
    }

    ReplyDelete
  2. კი მასეც შეილება, აქ კვარცს იყენებ ოღონდ. არა persistent სქედულერს შექმნის ეს. MDB არის აქ რომელიც კვარცის ინტერფეისის იმპლემენტაციას აკეთებს. კაი ვეშია კვარციც.

    არ გეთანხმები რაღაცაში - შეგიძლია ვაფშემცდა იმპლემეტაცია გააკეთო org.quartz.Job ისა, Message Driven Bean როცა არ გჭირდება ტყუილად არ უნდა გამოიყენო. კვარცთან ისე მერე გაქ SimpleTrigger და CronTrigger. მოკლედ, უფრო დახვეწილი როჟაა კვარცი, მარა როცა გჭირდება მაშინ უნდა გამოიყენო. JMS თუ არ გინდა, არ უნდა ჩათხარო ტყუილად EJB ში.

    ReplyDelete