深圳情缘 发表于 2006-6-25 17:49

EJB中的 Timer 看不明白 请各位高手解释一下!?

例子在《精通EJB》第三版第310页,由于基础比较差,在Bean类中很多看不懂,请高手们指点指点!
********看不懂的地方另外写在第三贴那了************

无状态会话Bean:
1.
远程接口: CleanDayLimitOrders.java

package coffee;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;


public interface CleanDayLimitOrders extends EJBObject
{
        public void cleanPeriodicallyDayLimitOrders() throws RemoteException;

}



2.
Home接口:CleanDayLimitOrdersHome.java
package coffee;

import javax.ejb.EJBHome;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import java.io.Serializable;


public interface CleanDayLimitOrdersHome extends EJBHome
{
        CleanDayLimitOrders create() throws RemoteException,CreateException;
}

[ 本帖最后由 深圳情缘 于 2006-6-25 18:06 编辑 ]

深圳情缘 发表于 2006-6-25 17:52

继续!!!Bean类

package coffee;

import javax.ejb.SessionContext;
import javax.ejb.SessionBean;
import javax.ejb.CreateException;
import javax.ejb.TimedObject;
import javax.ejb.TimerService;
import javax.ejb.Timer;
import java.util.TimeZone;
import java.util.Date;
import java.util.Calendar;
import java.util.SimpleTimeZone;
import java.util.GregorianCalendar;


public class CleanDayLimitOrdersBean implements SessionBean,TimedObject
{
        private SessionContext context;

        public CleanDayLimitOrdersBean(){}       
       
        public void cleanPeriodicallyDayLimitOrders()
        {
                //假定交易发生在NYSE、NASDAQ交易所
                String[] timezoneIDs = TimeZone.getAvailableIDs(-5*60*60*1000);
                SimpleTimeZone est = new SimpleTimeZone(-5*60*60*1000,timezoneIDs);
               
                //提供规则
                est.setStartRule(Calendar.APRIL,1,Calendar.SUNDAY,2*60*60*1000);
                est.setEndRule(Calendar.OCTOBER,-1,Calendar.SUNDAY,2*60*60*1000);
               
                //获得calendar实例
                Calendar cal = new GregorianCalendar(est);
               
                //将calendar设置成当前时间
                cal.setTime(new Date());
               
                //计算当前时间和停止交易时间(16:00) 的差别
                int hourofday = cal.get(cal.HOUR_OF_DAY);
                int minuteofhour = cal.get(cal.MINUTE);

                long start = 0;
                if(hourofday<16)
                {
                        int hourdiff = 16 - hourofday - 1;
                        int mindiff = 60 - minuteofhour;
                        start = (hourdiff*60*60*1000)+(mindiff*60*1000);
                }
               
                //最后,从EJBContext对象中获得Timer服务,并创建相应的Timer 。
                TimerService timerService = context.getTimerService();
                Timer timer = timerService.createTimer(start,10000,null);
               
                System.out.println("Timer create to first expire after "+start+" milliseconds.");
                }
               
                public void ejbTimeout(Timer timer)
                {
                        System.out.println("将那些还未执行过的限价订单从RDBMS中删除");
                }
       

       
        public void setSessionContext(SessionContext context)
        {
                System.out.println("执行setSessionContext方法");
                this.context = context;
        }
        public void ejbActivate()
        {
        }
        public void ejbPassivate()
        {
        }
        public void ejbRemove()
        {
        }

        public void ejbCreate()throws CreateException
        {       
                System.out.println("执行ejbCreate方法");
        }
       
}

深圳情缘 发表于 2006-6-25 17:58

不明之处:

不知道下面代码具体的作用是什么??
然后那些(-5*60*60*1000);(-5*60*60*1000,timezoneIDs);(Calendar.APRIL,1,Calendar.SUNDAY,2*60*60*1000);之类的东西又有什么用
之前都没接触过这些东西,
看不懂:L
基本上下面这大断代码看的是一头雾水,不知道什么跟什么



//假定交易发生在NYSE、NASDAQ交易所
                String[] timezoneIDs = TimeZone.getAvailableIDs(-5*60*60*1000);
                SimpleTimeZone est = new SimpleTimeZone(-5*60*60*1000,timezoneIDs);
               
                //提供规则
                est.setStartRule(Calendar.APRIL,1,Calendar.SUNDAY,2*60*60*1000);
                est.setEndRule(Calendar.OCTOBER,-1,Calendar.SUNDAY,2*60*60*1000);
               
                //获得calendar实例
                Calendar cal = new GregorianCalendar(est);//把est作为参数?也不明白

深圳情缘 发表于 2006-6-25 23:32

今天下午试了一下

今天下午试了一下居然没有触发到下面这个方法!?
我是在15:30分左右运行的    等到16:05分都没见到下面这句话的输出
public void ejbTimeout(Timer timer)
                {
                        System.out.println("将那些还未执行过的限价订单从RDBMS中删除");
                }

powerwind 发表于 2006-6-25 23:59

hjack,wool不知去哪了?
无奈还不懂!
打算暑假开始学,楼主多多指教啊!

深圳情缘 发表于 2006-6-26 13:19

一起努力啦

现在看了都不会应用,郁闷

楼上基础这么好应该很快就会了

暑假准备开始学HIBERNATE   和 SPRING   
暑假记得常回来看看啊

powerwind 发表于 2006-6-26 13:58

HIBERNATE 我看了一半,因为要考试就停了,剩下的也是暑假看。
就靠这个暑假了。
暑假我会一直在的。

hjack 发表于 2006-6-26 14:00

i am sorry.对ejb我也不是很懂。

powerwind 发表于 2006-6-26 14:03

原帖由 hjack 于 2006-6-26 14:00 发表
i am sorry.对ejb我也不是很懂。

我是很不懂!

wool王 发表于 2006-6-27 01:09

EJB我也是学习ING。。。回答不了楼上。。。我现在用spring框架。。。不过我上班后得用了,,,到时和楼主共同学习。。。

joe_233 发表于 2006-6-27 01:43

String[] timezoneIDs = TimeZone.getAvailableIDs(-5*60*60*1000);
--东5区 GMT+5
                SimpleTimeZone est = new SimpleTimeZone(-5*60*60*1000,timezoneIDs);
--所属时区代码 PNT timezoneIDs,timezoneIDs的话是MST

                est.setStartRule(Calendar.APRIL,1,Calendar.SUNDAY,2*60*60*1000);
--夏令时开始时间, 标准时间的4月 第一个星期 天 凌晨2点整
                est.setEndRule(Calendar.OCTOBER,-1,Calendar.SUNDAY,2*60*60*1000);
--夏令时结束时间,10月 最后一个星期天 凌晨2点整

joe_233 发表于 2006-6-27 01:48

Calendar cal = new GregorianCalendar(est);
EST是北美的时区的代码,GMT+5 忽略大小写

powerwind 发表于 2006-6-27 12:47

原帖由 wool王 于 2006-6-27 01:09 发表
EJB我也是学习ING。。。回答不了楼上。。。我现在用spring框架。。。不过我上班后得用了,,,到时和楼主共同学习。。。

还有我呢,你们不要嫌弃我啊!

深圳情缘 发表于 2006-6-27 13:23

哇 还真不是一般的复杂哦

原帖由 joe_233 于 2006-6-27 01:43 发表
String[] timezoneIDs = TimeZone.getAvailableIDs(-5*60*60*1000);
--东5区 GMT+5
                SimpleTimeZone est = new SimpleTimeZone(-5*60*60*1000,timezoneIDs);
--所属时区代码 PNT timezoneI ...


还真不是一般的复杂哦
这么难?莫非要学Hibernate    先?

joe_233 发表于 2006-6-27 22:42

....不用学这些...
只是EJB中一些很简单常用的类 方法

上面例子应用到的地方比如说网上炒汇平台,
汇市由纽约开市,然后随着地球公转到东京,香港,悉尼,...伦敦..等.
24小时不停顿,用户登陆的时候会判断该时区的编码,通过GMT转换为当地时间.
也可以通过判断正在开市地区的编码来确定交易标准时间.

两个时间都通过GMT转换所以才不会起冲突.

因为欧洲大部分地区到夏天会启用夏令时,为了不受影响EJB里面也有有关夏令时的方法使用。
可以设置启动时间和结束时间。在这段时间内,当地的时间与GMT时间不再是正常的时区偏差计算,还要加1.

比如说柏林在东一区,启用夏令时后当地时间应该为GMT+2北京是GMT+8 所以两地相差是6小时而不是7小时
我们国家以前也用过夏令时,后来为了便于管理而取消

joe_233 发表于 2006-6-27 22:55

sorry,是随着地球自转

wool王 发表于 2006-6-27 23:56

原帖由 深圳情缘 于 2006/6/27 05:23 发表



还真不是一般的复杂哦
这么难?莫非要学Hibernate    先?


你如果学EJB3的话就建议了解下hibernate先。

hshx01 发表于 2012-4-28 15:57

我们都还好,只是各自的身边再也出现不了那些曾经熟悉的影子。当年的我们,幸福的缺氧。

czxyq 发表于 2012-12-31 01:50

楼主辛苦了,鼓励一下
页: [1]
查看完整版本: EJB中的 Timer 看不明白 请各位高手解释一下!?