commonj.timers.TimerManager

“Timer and Work Manager API (CommonJ) Programmer's Guide”  参考地址:http://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html        中文版:http://www.blogjava.net/beansoft/archive/2012/02/19/370298.html

博文“在ADF中使用CommonJ的TimerTask”    参考地址: http://oracleseeker.com/2010/11/22/adf_weblogic_commonj_timertask/

上一篇博文是一位师兄写的,写的很清晰,重复的就不再说了,关键是再说说实现部分,下面引用实现(蓝体子部分):

实现

1、创建ADF应用
2、打开ViewController项目的web.xml文件,增加对于CommonJ的引用,即在web.xml中增加如下代码:
 <resource-ref>
  <res-ref-name>tm/TimerManager</res-ref-name>
  <res-type>commonj.timers.TimerManager</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Unshareable</res-sharing-scope>
 </resource-ref>

3、在web.xml中注册servlet,在该servlet中实现对于CommonJ中的WorkManager的调用,注册该servlet的代码如下:
 <servlet>
  <display-name>timertask</display-name>
  <servlet-name>timertask</servlet-name>
  <servlet-class>hand.hadf.howto.timertask.view.servlet.TimerServlet</servlet-class>
  <load-on-startup>100</load-on-startup>
 </servlet>

4、实现名为TimerServlet的servlet,在其init(ServletConfig servletConfig)的方法中添加如下代码(这里每10秒进行一次Task调用):
 @Override
 public void init(ServletConfig servletConfig) throws ServletException {
  System.out.println(“init servletConfig”);
  TimerManager tm = null;
  InitialContext ic;
  try {
   ic = new InitialContext();

   tm = (TimerManager)ic.lookup(“java:comp/env/tm/TimerManager”);
  } catch (NamingException e) {
  }
  Timer batchRunTimer = null;
  Boolean batchRunTimerIsRunning = false;

  ScheduedTask task = new ScheduedTask();
  batchRunTimer = tm.schedule(task, 0, 10000);

  batchRunTimerIsRunning = true;
  servletConfig.getServletContext().setAttribute(“batch”, batchRunTimer);
  servletConfig.getServletContext().setAttribute(“batchRunning”,
                          batchRunTimerIsRunning);

  super.init(servletConfig);
 }
5、新建名为ScheduedTask的类,作为Timer启动时调用的Task,并实现相应的Listener接口(CancelTimerListener, TimerListener),以注册相应的Listener,在Timer触发时候进行逻辑处理

6、保存应用,并部署到WebLogic中,查看打印出的日志
init servletConfig
timerExpired10000
timerExpired10000
timerExpired10000
timerExpired10000

……

想说的是这里注册servlet是为了是为了让ADF应用在部署完成之后就开始启动timer,“<load-on-startup>100</load-on-startup>”的作用就是在告诉weblogic部署完成之后就开始运行servlet,继而启动timer。然而,如果我们不需要再部署完成之后就启动timer,而是人工控制timer的启动,那么servlet也就不需要了,只需要用户界面上的一个button 绑定到一个backingbean的方法上就可以了,如下:

import commonj.timers.TimerManager;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import view.commonj.timer.app.timerTask.ScheduedTask;

public class Handle {
    public Handle() {
    }

    public String start() {
        // Add event code here...
        System.out.println(" TimerServlet init running");
        TimerManager tm = null;
        InitialContext ic;
        try {
          ic = new InitialContext();

          tm = (TimerManager)ic.lookup("java:comp/env/tm/TimerManager");
        } catch (NamingException e) {
        }
        ScheduedTask task = new ScheduedTask();
        tm.schedule(task, 0, 10000);
        return null;
    }
}

 

你可能感兴趣的:(commonj.timers.TimerManager)