3)对于Timer的持久性,我采用重启服务器的方法,当服务器重新启动后,如果时间还没有超时,服务器会继续计时,这一点是正确的;另一种情况下,如果启动后时间已经超时,服务器会在启动后立即调用ejbTimeout,试验通过。
4)针对三个方法的事务特性,我分别写代码来测试。首先,单独将createTimer方法包含在一个UserTransaction事务中,并在运行中将事务rollback。试验中,服务器将事务回滚,之后Timer不再起作用,没有调用ejbTimeout方法。代码如下:
public String getHello(){ UserTransaction tx = sessionContext.getUserTransaction(); tx.begin(); ts.createTimer(30000, null); tx.setRollbackOnly(); tx.commit(); } 5)对于cancel方法的事务特性,和上面的过程类似,将Timer.cancel()包含在一个事务中,并在运行过程中将事务rollback。试验中,服务器将事务回滚,之后Timer可以继续计时,并调用ejbTimeout方法。代码如下:public String getHello(){ Timer at = ts.createTimer(30000, null); UserTransaction tx = sessionContext.getUserTransaction(); tx.begin(); at.cancel(); tx.setRollbackOnly(); tx.commit();} } 6)对于ejbTimeout方法的事务特性,试验时我把这个方法的CMT属性设置为RequiresNew,同时在此方法中模拟失败后调用rollback的情况,首先服务器把事务回滚,然后在5秒后再次调用ejbTimeout方法,完全和规范描述的一样。实际上这个5秒的时间是可以自己配置的,在apusic.conf文件中,有EJBTimerService的配置,内容如下: <SERVICE CLASS="com.apusic.ejb.timer.EJBTimerService"> <ATTRIBUTE NAME="RedeliveryInterval" VALUE="5000"/> <ATTRIBUTE NAME="MaxRedeliveries" VALUE="1"/> </SERVICE> 其中的RedeliveryInterval指的就是重新调用ejbTimeout的等待时间。而另一项MaxRedeliveries属性指的是重新调用的次数。 我测试的代码如下:public void ejbTimeout(Timer timer){ System.out.println("timer expired"); sessionContext.setRollbackOnly(); } 四、结束语 EJB 2.1中新增的EJB Timer Service功能虽然简单,但是它的一些高级特性却很实用,遗憾的是大家还没有注意到这些特性,我在这里抛砖引玉,做一个小小的测试,希望能对哪些对Timer服务感兴趣的人有帮助。以上所有特性都只在Apusic 4.0上进行了试验,全部通过测试。本来还想在Weblogic 9.0 beta上也做相同的测试,但是我拿到的版本总是不能顺利的部署J2EE 1.4的应用,无奈只好放弃,还请有兴趣的朋友做进一步测试。 |
閺€鎯版閹存劕濮�閺屻儳婀呴弨鎯版>>
正在阅读:EJB Timer Service的高级特性心得分享EJB Timer Service的高级特性心得分享
2005-06-16 10:14
出处:
责任编辑:moningfeng
键盘也能翻页,试试“← →”键