<document>
<deftable>
Configures the TimerResource
The resource implementation registers a launching task with the Timer and provides common state.
The timer task which launches the work task.
The work task executes the long task.
The starting page for the tutorial
</deftable>

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.

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); } } }

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

public class WorkTask implements Work { private TimerResource _resource; WorkTask(TimerResource resource) { _resource = resource; } public void run() { _resource.addCount(); } public void release() { } }

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.

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 + "]"; } }

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

<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.

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