“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触发时候进行逻辑处理
……
想说的是这里注册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;
}
}