如果您需要自动创建计时器,EJB @Schedule 注释会派上用场。可以使用类似 cron 的表达式来配置适当的计划。如果您需要更大的灵活性,旧的 TimerService 很有用。
快速背景
- TimerService 接口是在 EJB 2.1 中引入的[是的.. J2EE 时代! ;-) ]
- 用于以编程方式创建 Timer 对象
- 用于与 TimedObject 接口 [EJB 3.0 之前] 的实现结合使用,作为定时器触发器的回调
- 从 EJB 3.0 开始, @Timeout 注释用于标记(无状态/单例/消息驱动)bean 中的方法,以充当来自 EBJ 容器的计时器回调的接收者
- EJB 3.1 通过引入 ScheduleExpression 进一步改进了事情,它允许细粒度的定时器调度——这是 @Schedule 的编程等价物
EJB Timer相关组件(供快速参考)
RESTful 定时器
人们可以很容易地公开一个简单的 RESTful 接口来使用 EJB 计时器。创建计时器、获取计时器详细信息以及取消计时器等操作可以即时执行。
通过 这个 Github 项目 可以获得一个简单的实现。这是一个基于 Netbeans 构建的简单 Java EE 7 Maven 项目。您应该能够轻松设置它。
这是一个要点
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response schedule(@HeaderParam("name") final String timerName, final ScheduleConfiguration config) {
auditScheduler.schedule(from(config), new TimerConfig(timerName, config.isPersistent()));
return Response.created(UriBuilder.fromResource(AuditSchedulerResource.class).path(timerName).build(timerName)).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response schedule(@HeaderParam("name") final String timerName, final ScheduleConfiguration config) {
auditScheduler.schedule(from(config), new TimerConfig(timerName, config.isPersistent()));
return Response.created(UriBuilder.fromResource(AuditSchedulerResource.class).path(timerName).build(timerName)).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response schedule(@HeaderParam("name") final String timerName, final ScheduleConfiguration config) {
auditScheduler.schedule(from(config), new TimerConfig(timerName, config.isPersistent()));
return Response.created(UriBuilder.fromResource(AuditSchedulerResource.class).path(timerName).build(timerName)).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response schedule(@HeaderParam("name") final String timerName, final ScheduleConfiguration config) {
auditScheduler.schedule(from(config), new TimerConfig(timerName, config.isPersistent()));
return Response.created(UriBuilder.fromResource(AuditSchedulerResource.class).path(timerName).build(timerName)).build();
}
WADL 应该讲故事