9 定时器服务

来源:互联网 发布:金蝶数据库置疑 编辑:程序博客网 时间:2024/04/29 13:04

定时器服务是容器提供的服务, 允许应用计划定时器并在定时器期满的时候接收通知. 定时器像其他容器管理的资源一样, 并且在存为会话数据的情况下可选地被持久化. 定时器可以计划在指定的时间后期满一次, 或者以指定的时间重复.定时器支持由下面三个接口组成: TimerService 在创建定时器的时候用到, ServletTimer 代表一个定时器并会在在回调的时候返回, 以及 TimerListener 回调接口, 由应用实现并在定时器期满的时候由容器执行.

 

9.1 TimerService

TimerService 接口是由容器实现并且应用可以通过名为 javax.servlet.sip.TimerService 的 ServletContext 参数取得并使用它. 这个接口提供了下面的方法:

  1. ServletTimer createTimer(SipApplicationSession appSession,
  2. long delay,
  3. boolean isPersistent,
  4. java.io.Serializable info);
  5. ServletTimer createTimer(SipApplicationSession appSession,
  6. long delay,
  7. long period,
  8. boolean fixedDelay,
  9. boolean isPersistent,
  10. java.io.Serializable info);

ServletTimer 对象和一个应用会话相关联. 这个应用可以存储数据到这个应用会话并且可以在不久后当定时器触发时取到它.

SipApplicationSession 接口的 getTimers 方法返回一个包含了当前计划好的和那个会话关联的所有的 ServletTimer 对象的

java.util.Collection 类型的集合. 同样的, getTimer(id) 方法返回当前和那个会话关联的计划好的指定 ID 的 ServletTimer .

createTimer 方法的参数的意义如下:

appSession 新建的定时器相关联的应用会话.
delay ServletTimer 第一次期满前延时的时间, 单位为毫秒.
period 两次连续的定时器期满之间的时间间隔, 单位为毫秒.
fixedDelay
isPersistent 如果为真, 那么这个 ServletTimer 应当在服务器关闭并随后重启之后重新初始化. 在重启的过程中, 这个容器会调用  在关闭过

程中期满的定时器的 TimerInterface. ServletTimer 相关的 SipApplicationSession 应当是被持欠化的.
info 应用信息和定时器期满一起传递. 在对于一个应用会话设置了多个定时器时区分一个定时器的期满的意义时很有用处.

 

9.2 ServletTimer

ServletTimer 接口代表了计划的定时器. 应用会话, 定时器 ID 以及序列化信息对象等信息可以在期满回调方法中通过这个接口取得. 这个接口也可让应用取消定时器以及获取关于上次或下次计划的期满时间的信息.

这个接口提供了下面的方法:

  1. SipApplicationSession getApplicationSession();
  2. java.io.Serializable getInfo();
  3. String getId();
  4. long scheduledExecutionTime();
  5. long getTimeRemaining();
  6. void cancel();

9.3 TimerListener

应用程序通过 TimerListener 接口来接收定时器期满的通知. 这个接口只有一个方法:

  1. void timeout(ServletTimer timer);

应用程序要使用定时器的话必须实现这个接口并且必须在 SIP 部署描述文件的定时元素(会在下面描述)中申明实现的类的名称, 也可以使用 @SipListener 标注来申明. 例如, 一个应用程序包含一个实现了 javax.servlet.sip.TimerListener 接口的类 com.example.MyTimerListener. 可以如下一样在 SIP 部署描述文件中申明这个侦听器:

  1. <listener>
  2. <listener-class>com.example.MyTimerListener</listener-class>
  3. </listener>

在部署描述文件中最多只能申明一个 TimerListener 接口的实现.

 

原创粉丝点击