kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

          http://computer.mblogger.cn/sammi_tea
          http://www.weste.net/html/200310/20031029QBI124658.html

          使用
          Timer Service 可以在某一指定時(shí)間到了,或周期性Schedule開(kāi)始時(shí),通知EJB執(zhí)行指定操作。為了使用Timer Service,EJB需要實(shí)現(xiàn)javax.ejb.TimedObject接口。

          public interface TimedObject {

                public void ejbTimeout(Timer timer) ;

          }

          例如:當(dāng)時(shí)間到,EntityBean執(zhí)行數(shù)據(jù)更新操作

          public abstract class ShipBean implements javax.ejb.EntityBean, javax.ejb.TimedOut {

              javax.ejb.EntityContext ejbContext;

              public void setEntityContext(javax.ejb.EntityContext ctxt){

                   ejbContext = ctxt;

              }

              public void ejbTimedout(javax.ejb.Timer timer) {

                 // business logic for timer goes here

          }

          。。。。

          從上面的使用例子看ejbTimedout是一個(gè)回調(diào)方法,執(zhí)行具體的商業(yè)邏輯,那么怎樣設(shè)置什么時(shí)間觸發(fā)這個(gè)方法呢,我們利用javax.ejb.TimerSevice。該對(duì)象我們可以從EJBContext中獲得該對(duì)象實(shí)例。為此我們?cè)谏厦娴睦又刑砑右粋€(gè)ejbHome方法scheduleMaintenance。

          public inteface ShipBeanHome implements javax.ejb.EJBHome {

          ShipBeanRemote create() throws CreateException, RemoteException;

          void scheduleMaintenance(String desc, Date scheduleDate) throws RemoteException;

          ……

          }

           

          public abstract class ShipBean implements javax.ejb.EntityBean, javax.ejb.TimedOut {

              javax.ejb.EntityContext ejbContext;

              public void setEntityContext(javax.ejb.EntityContext ctxt){

                   ejbContext = ctxt;

          }

          public void ejbScheduleMaintenance(String desc, Date scheduleDate) {

                TimerService service = ejbContext.getTimerService();

          Service.createTime(scheduleDate, desc);

          }

              public void ejbTimedout(javax.ejb.Timer timer) {

                 // business logic for timer goes here

          }

           

          TimerService中提供了設(shè)置了Timer的方法,包括設(shè)置一個(gè)時(shí)間點(diǎn)(ejbTimedOut方法運(yùn)行一次)和時(shí)間間隔(ejbTimedOut方法運(yùn)行多次)。另外,它還提供了getTimer()的方法,該方法返回一個(gè)Collection,里面包含了已經(jīng)注冊(cè)了的所有Timer對(duì)象。

           

          Timer接口

          public interface Timer {

              // Cause the timer and all its associated expiration notifications to be canceled

              public void cancel() 

                   throws IllegalStateException,NoSuchObjectLocalException,EJBException;

              // Get the information associated with the timer at the time of creation.

              public java.io.Serializable getInfo()

                   throws IllegalStateException,NoSuchObjectLocalException,EJBException;

              // Get the point in time at which the next timer expiration is scheduled to occur.

              public java.util.Date getNextTimeout()

                   throws IllegalStateException,NoSuchObjectLocalException,EJBException;

              // Get the number of milliseconds that will elapse before the next scheduled timer expiration

              public long getTimeRemaining()

                   throws IllegalStateException,NoSuchObjectLocalException,EJBException;

              //Get a serializable handle to the timer.

              public TimerHandle getHandle()

                   throws IllegalStateException,NoSuchObjectLocalException,EJBException;

          }

          Cancel方法用來(lái)取消一個(gè)已經(jīng)無(wú)效的Timer(時(shí)間點(diǎn)已經(jīng)過(guò)去)。

          GetInfo方法獲得一個(gè)Timer的相關(guān)信息,這些信息在createTimer時(shí)作為參數(shù)和Timer聯(lián)系在一起。在前面的例子中,為了防止客戶胡亂調(diào)用ejbHome方法scheduleMaintenance,我們可以為每一個(gè)設(shè)定的時(shí)間添加一個(gè)唯一編號(hào)。修改后的代碼如下:

          public class MaintenanceItem implements java.io.Serializable {

              private long maintenanceItemNumber;

              private String description;

              public MaintenanceItem(long min, String desc){

                  maintenanceItemNumber = min;

                  description = desc;

              }

              public long getMIN(){

                  return maintenanceItemNumber;

              }

              public String getDescription(){

                  return description;

              }

          public void scheduleMaintenance(MaintenanceItem maintenanceItem, Date dateOfTest){

                  TimerService timerService = ejbContext.getTimerService();

                  java.util.Iterator timers = timerService.getTimers().iterator();

                  while( timers.hasNext() ){

                          javax.ejb.Timer timer = (javax.ejb.Timer) timers.next();

                          String timerMainItem = (MaintenanceItem) timer.getInfo();

                          if( maintenanceItem.getMIN() == timerMainItem.getMIN() )

                               timer.cancel();

                          }

                  }

                  timerService.createTimer( dateOfText, maintenanceItem);

              }

          TimerServiceTransaction

          TimerService可以參與Transaction,當(dāng)createTimer如果在Transaction中,如果該transaction rollback則創(chuàng)建的Timer也會(huì)取消。





          posted on 2005-03-29 10:50 笨笨 閱讀(448) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALL
          主站蜘蛛池模板: 清苑县| 彝良县| 内江市| 云和县| 肥乡县| 阜城县| 云梦县| 深州市| 定兴县| 霍邱县| 余干县| 湖南省| 湟中县| 普兰县| 阆中市| 马边| 凯里市| 广东省| 舞阳县| 商水县| 芒康县| 大荔县| 德保县| 明水县| 泰宁县| 新竹县| 萍乡市| 台北县| 芜湖县| 石嘴山市| 阳山县| 江津市| 肇源县| 玉山县| 临桂县| 黄冈市| 阳山县| 肇庆市| 资兴市| 麻江县| 沅江市|