JavaEE 中的 RESTful 定时器

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

如果您需要自动创建计时器,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 应该讲故事



    相关文章