scheduledtask.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 332 行

JAVA
332
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.resources;import com.caucho.config.ConfigException;import com.caucho.config.types.*;import com.caucho.loader.*;import com.caucho.util.*;import com.caucho.webbeans.manager.*;import com.caucho.server.connection.*;import com.caucho.server.webapp.*;import javax.annotation.PostConstruct;import javax.el.*;import javax.resource.spi.work.Work;import javax.servlet.*;import javax.webbeans.*;import java.util.*;import java.util.concurrent.Executor;import java.util.logging.*;/** * The cron resources starts application Work tasks at cron-specified * intervals. */public class ScheduledTask extends BeanConfig  implements AlarmListener, EnvironmentListener{  private static final L10N L = new L10N(ScheduledTask.class);  private static final Logger log    = Logger.getLogger(ScheduledTask.class.getName());  @In  private Executor _threadPool;  private ClassLoader _loader;    private Trigger _trigger;    private TimerTrigger _timerTrigger = new TimerTrigger();    private Runnable _task;  private MethodExpression _method;    private String _url;  private WebApp _webApp;    private Alarm _alarm;  private volatile boolean _isActive;  /**   * Constructor.   */  public ScheduledTask()  {    _loader = Thread.currentThread().getContextClassLoader();    setBeanConfigClass(Runnable.class);  }  /**   * Sets the delay   */  public void setDelay(Period delay)  {    _trigger = _timerTrigger;    _timerTrigger.setFirstTime(Alarm.getCurrentTime() + delay.getPeriod());  }  /**   * Sets the period   */  public void setPeriod(Period period)  {    _trigger = _timerTrigger;    _timerTrigger.setPeriod(period.getPeriod());  }  /**   * Sets the cron interval.   */  public void setCron(String cron)  {    _trigger = new CronType(cron);  }  /**   * Sets the method expression as a task   */  public void setMethod(MethodExpression method)  {    _method = method;  }  /**   * Sets the url expression as a task   */  public void setUrl(String url)  {    if (! url.startsWith("/"))      throw new ConfigException(L.l("url '{0}' must be absolute", url));        _url = url;    ComponentFactory comp      = WebBeansContainer.create().resolveByType(WebApp.class);    if (comp == null)      throw new ConfigException(L.l("relative url '{0}' requires web-app context",				    url));    _webApp = (WebApp) comp.get();  }  /**   * Sets the work task.   */  @Deprecated  public void setWork(Runnable work)  {    setTask(work);  }  /**   * Sets the task.   */  public void setTask(Runnable task)  {    _task = task;    setClass(task.getClass());  }  /**   * Initialization.   */  @PostConstruct  public void init()    throws ConfigException  {    if (_method != null) {      _task = new MethodTask(_method);    }    else if (_url != null) {    }    else      super.init();    if (_trigger == null) {      _timerTrigger.setFirstTime(Long.MAX_VALUE / 2);      _trigger = _timerTrigger;    }        Environment.addEnvironmentListener(this);  }  private void start()  {    long now = Alarm.getCurrentTime();        long nextTime = _trigger.nextTime(now);    _isActive = true;    if (_url != null)      _task = new ServletTask(_url, _webApp);    if (_task == null)      _task = (Runnable) getObject();    assert(_task != null);    _alarm = new Alarm("cron-resource", this, nextTime - now);    if (log.isLoggable(Level.FINER))      log.finer(this + " started. Next event at " + new Date(nextTime));  }  private void stop()  {    _isActive = false;    Alarm alarm = _alarm;    _alarm = null;        if (alarm != null)      alarm.dequeue();    if (_task instanceof Work)      ((Work) _task).release();    else if (_task instanceof TimerTask)      ((TimerTask) _task).cancel();  }  /**   * The runnable.   */  public void handleAlarm(Alarm alarm)  {    if (! _isActive)      return;    Thread thread = Thread.currentThread();    ClassLoader oldLoader = thread.getContextClassLoader();    try {      thread.setContextClassLoader(_loader);            log.fine(this + " executing " + _task);      _threadPool.execute(_task);      // XXX: needs QA      long now = Alarm.getCurrentTime();      long nextTime = _trigger.nextTime(now);      if (_isActive)	alarm.queue(nextTime - now);    } catch (Exception e) {      log.log(Level.WARNING, e.toString(), e);    } finally {      thread.setContextClassLoader(oldLoader);    }  }  public void environmentConfigure(EnvironmentClassLoader loader)    throws ConfigException  {  }  public void environmentBind(EnvironmentClassLoader loader)    throws ConfigException  {  }    public void environmentStart(EnvironmentClassLoader loader)  {    start();  }    public void environmentStop(EnvironmentClassLoader loader)  {    stop();  }  public String toString()  {    return getClass().getSimpleName() + "[" + _task + "," + _trigger + "]";  }  public static class MethodTask implements Runnable {    private static final Object[] _args = new Object[0];        private ELContext _elContext;    private MethodExpression _method;    MethodTask(MethodExpression method)    {      _method = method;      _elContext = WebBeansContainer.create().getELContext();    }    public void run()    {      _method.invoke(_elContext, _args);    }    public String toString()    {      return getClass().getSimpleName() + "[" + _method + "]";    }  }  public class ServletTask implements Runnable {    private String _url;    private WebApp _webApp;    ServletTask(String url, WebApp webApp)    {      _url = url;      _webApp = webApp;    }    public void run()    {      StubServletRequest req = new StubServletRequest();      StubServletResponse res = new StubServletResponse();      try {	RequestDispatcher dispatcher = _webApp.getRequestDispatcher(_url);		dispatcher.forward(req, res);      } catch (Exception e) {	log.log(Level.FINE, e.toString(), e);      }    }    public String toString()    {      return getClass().getSimpleName() + "[" + _url + "," + _webApp + "]";    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?