JavaEE 中的 RESTful 定时器

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

如果您需要自动创建计时器,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 请求以安排计时器(JSON/XML 有效负载表示计划配置)

  • 
     @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();
    }
    


  • 获取所有活动计时器及其各自的详细信息(JSON/XML 表示)
  • 
     @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();
    }
    


  • 获取特定计时器的信息(JSON/XML 表示)
  • 
     @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();
    }
    


  • DELETE(取消)现有计时器
  • 
     @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 应该讲故事