Resource Timers

Resources can use the JCA timer capability to manage periodic tasks. The timers use the familiar java.util.Timer, providing extra support for the environment lifecycle.

Timers start short tasks. Longer timed tasks will use the timer in combination with the JCA work management API.

Demo

Files in this tutorial

WEB-INF/web.xmlConfigures the TimerResource
WEB-INF/classes/example/TimerResource.javaThe resource implementation registers a launching task with the Timer and provides common state.
WEB-INF/classes/example/WorkScheduleTimerTask.javaThe timer task which launches the work task.
WEB-INF/classes/example/WorkTask.javaThe work task executes the long task.
index.jspThe starting page for the tutorial

The Timer task

The java.util.Timer provides an API to launch periodic tasks. Because the timer tasks are expected to be short, the timer needs to launch a longer-lived Work task for the actual work. The work tutorial gives more information on the JCA Work API.

Resin provides the Timer to the resource's start and shuts it down properly when the resource environment closes (web-app, host, server, etc.) In other words, resources should not create java.util.Timer objects directly, but should use the BootstrapContext to create the timers.

The TimerTask API resembles the familiar Runnable API for threads. Most application will just need to implement the run() method for the task's code.

WorkScheduleTimerTask.java
public class WorkScheduleTimerTask extends java.util.TimerTask {
  private static final Logger log =
    Logger.getLogger(TimerTask.class.getName());

  private WorkManager _workManager;
  private Work _work;

  WorkScheduleTimerTask(WorkManager workManager, Work work)
  {
    _workManager = workManager;
    _work = work;
  }

  public void run()
  {
    try {
      _workManager.scheduleWork(_work);
    } catch (WorkException e) {
      log.log(Level.WARNING, e.toString(), e);
    }
  }
}

The work task

For this example, the work task is trivial. It just increments a counter in the TimerResource.

WorkTask.java
public class WorkTask implements Work {
  private TimerResource _resource;

  WorkTask(TimerResource resource)
  {
    _resource = resource;
  }

  public void run()
  {
    _resource.addCount();
  }

  public void release()
  {
  }
}

The Resource

The TimerResource in this example just registers the timer tasks and exits. As before, the resource extends com.caucho.jca.AbstractResourceAdapter to simplify the example.

TimerResource.java
public class TimerResource extends AbstractResourceAdapter {
  private int _count;
  
  /**
   * Adds to the count.
   */
  public void addCount()
  {
    _count++;
  }

  public void start(BootstrapContext ctx)
    throws ResourceAdapterInternalException
  {
    WorkManager workManager = ctx.getWorkManager();
    
    Work work = new WorkTask(this);

    TimerTask timerTask = new WorkScheduleTimerTask(workManager, work);

    Timer timer = ctx.createTimer();

    long initialDelay = 0;
    long period = 10000L;

    timer.schedule(timerTask, initialDelay, period);
  }
  
  public void stop()
    throws ResourceAdapterInternalException
  {
  }

  public String toString()
  {
    return "TimerResource[" + _count + "]";
  }
}

Configuration and JSP

The configuration for this resource is trivial since it has no attributes.

web.xml
<resource name="jca/timer" type="example.TimerResource"/>

The demo JSP is also trivial. It looks up the resource through JNDI and prints it to the page.

index.jsp
<%@ page import="javax.naming.*" %>
<%= new InitialContext().lookup("java:comp/env/jca/timer") %>

Demo


Copyright © 1998-2006 Caucho Technology, Inc. All rights reserved.
Resin ® is a registered trademark, and Quercustm, Ambertm, and Hessiantm are trademarks of Caucho Technology.