EJB3 TimerService
EJB3 的计时器服务相对简单,此服务允许在指定时间间隔后自动调用某方法,当指定的时间到期时容器就会调用超时方法(即Timeout注解的方法)。TimerService只能在无状态Session bean和MDB中使用,因为它们是异步和无状态的。 
下面举例说明(服务器为JBoss5.0.1): 
1.建立一接口和Session Bean 
- public interface ITimerService {
- public void scheduleTimer(long milliseconds);
- }
- @Stateless
- @Remote(ITimerService.class)
- public class TimerServiceBean implements ITimerService {
- private static int count = 0;
- @Resource
- private SessionContext sc;
- public void scheduleTimer(long milliseconds) {
- TimerService timerService = sc.getTimerService();
- timerService.createTimer(5000, milliseconds, "EJB Timer");
- }
- @Timeout
- public void timeoutHandler(Timer timer) {
- System.out.println("count=" + count + " get Info : " + timer.getInfo());
- if (count >= 3) {
- timer.cancel();
- } else {
- count++;
- }
- }
- }
有几点需要说明一下: 
(1).获取TimerService有两种方式,除上面的通过EJB上下文方式获取以外,还可以通过EJB资源直接注入计时器服务: 
- @Resource
- private TimerService timerService;
如果已经注入了EJB上下文,则第一种较为合适,因为这样就不需要再注入计时器服务了。否则使用第二种更好。 
(2)一个bean只能有一个超时方法(即@Timeout方法) 
(3)cancel():终止计时器。 
(4)上面的createTimer()方法参数参考: 
- public Timer createTimer(long initialDuration,
- long intervalDuration,java.io.Serializable info)
表示在initialDuration(ms)后第一次触发,然后每间隔intervalDuration(ms)后重复。其中的info可通过getInfo()方法获取,表示创建Timer时的附加信息。 
将上面两个class文件打包发布成一个ejb-jar文件进行部署。 
为了测试刚才发布的EJB是否能正确调用,写一测试类: 
- public class TimerServiceTest {
- public static void main(String[] args) {
- try {
- Context ctx = new InitialContext();
- ITimerService timer = (ITimerService) ctx.lookup("TimerServiceBean/remote");
- timer.scheduleTimer(3000);
- } catch (NamingException e) {
- e.printStackTrace();
- }
- }
- }
posted on 2013-02-25 11:23 pretty_pretty_fish 阅读(322) 评论(0) 收藏 举报
 
                    
                     
                    
                 
                    
                 
 
        
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号