WEB-INF/web.xml

<web-app xmlns="http://caucho.com/ns/resin">
  <!-- 
    - Instantiate an instance of PeriodTaskImpl and store it in jndi.
    - The periodic task is then available for use in the various ways
    - illustrated below.
    -
    - The interface for PeriodicTaskImpl is PeriodicTask, which is the
    - view of the object provided to users of the service.
    -->
  <resource type="example.PeriodicTask" jndi-name="PeriodicTask" 
            mbean-name="type=PeriodicTask,name=PeriodicTask"
            mbean-interface="example.PeriodicTask">
    <init>
      <estimated-average-time>5</estimated-average-time>
    </init>
  </resource>

  <!-- 
     - servlet to manage the PeriodicTask
    -->

  <servlet>
    <servlet-name>PeriodicTaskServlet</servlet-name>
    <servlet-class>example.PeriodicTaskServlet</servlet-class>
    <init>
      <periodic-task>${jndi:lookup("PeriodicTask")}</periodic-task>
    </init>
  </servlet>

  <servlet-mapping>
    <servlet-name>PeriodicTaskServlet</servlet-name>
    <url-pattern>/admin/periodictask</url-pattern>
  </servlet-mapping>

  <!-- 
     - run() the PeriodicTask every minute 
    -->
  <resource type="com.caucho.resources.CronResource">
    <init>
      <cron>*</cron>
      <work>${jndi:lookup("PeriodicTask")}</work>
    </init>
  </resource>

  <!-- 
     - filter to show an unavailable page if the PeriodicTask is active 
    -->

  <filter>
    <filter-name>PeriodicTaskFilter</filter-name>
    <filter-class>example.PeriodicTaskFilter</filter-class>
    <init>
      <periodic-task>${jndi:lookup("PeriodicTask")}</periodic-task>
      <!-- optional url, if not specified a 503 response is sent. -->
      <url>/unavailable.jsp</url>
    </init>
  </filter>

  <filter-mapping>
    <!-- regexp to match all urls except /admin and /index.xtp-->
    <filter-name>PeriodicTaskFilter</filter-name>
    <url-regexp>^(?!/admin|/index.xtp)+</url-regexp>
  </filter-mapping>

</web-app>