在ActFramework中进行后台任务调度

任务调度注解

在Actframework的应用当中进行任务调度的方式是使用任务调度注解标记任务方法。 ActFramework支持的任务调度注解包括:

  • @AlongWith - 指定该方法与某个任务一同执行(异步)
  • @Cron - 使用类unix的cron表达式来调度执行该方法
  • @Every - 定期执行该方法
  • @FixedDelay - 固定间隔执行该方法
  • @InvokeAfter - 指定该方法在某个任务之后执行(同步)
  • @InvokeBefore - 指定该方法在某个任务之前执行(同步)
  • @OnAppEvent - 指定当某个AppEvent触发时执行该方法
  • @OnAppStart - 当App启动时执行该方法
  • @OnAppStop - 当App停止时执行该方法

任务方法

任务方法的要求:

  1. 没有返回值,如果有返回值,返回值会被自动忽略
  2. 除了能进行依赖注入的类型,不能有其他类型的参数

任务方法可以是静态的也可以是虚函数。当任务方法不是静态方法的时候,声明方法的类不能是抽象类。任务方法示例:

  • 使用类unix cron表达式调度 /** * This method is scheduled to run every minute */ @Cron("0 * * * * ?") public void backup() { JobLog.log("SomeService.backup"); }
  • 当应用启动完成后调度 @OnAppStart(async = true) public void onAppStartAsync() { JobLog.log("onAppStartAsync called"); }
  • 一个错误声明的任务方法,方法参数列表中有一个无法进行依赖注入的参数 @Every("3s") public String schedule(int n) { processor.process("DI in field" + n); return "ignored"; }
  • 如果方法声明中的参数可以被依赖注入,则方法是有效的任务方法: /* * Here we support User.Dao and PostMan are injectable types */ @Every("1d") public void sendPasswordExpirationReminder(User.Dao userDao, PostMan postman) { Iterable<User> users = userDao.passwordExpireSoon(); for (User user: users) { postman.sendPasswordExpireReminderEmail(user); } }

如何解决集群任务调度冲突

ActFramework是能够进行水平扩容的。假设我们有多台服务器运行同样的ActFramework应用,任务调度势必发生冲突。Act提供了一种巧妙的解决办法。在启动应用的时候可以使用-Dapp.nodeGroup=xxx参数来指定当前应用节点的group,比如-Dapp.nodeGroup=job, 然后在任务方法上使用Env.Group("job")来指定这个方法只能在指定为jobgroup的应用节点上运行:

/**
 * This method will get called every x, where
 * `x` is configured through `every.check_status`
 * configuration
 */
@Every(value = "every.check_status", id = "CHECK_STATUS")
@Env.Group("job")
public void checkStatus() {
    JobLog.log("SomeService.checkStatus");
}

这是一种简单易用的处理多应用服务任务调度冲突的办法

需要进一步了解ActFramework的任务调度可以试试运行调试任务调度演示项目:

链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海天一树

小朋友学Java(12):包

包(package)是Java语言提供的一种区别类名字命名空间的机制,它是类的一种文件组织和管理方式、是一组功能相似或相关的类或接口的集合。Java packa...

2726
来自专栏大内老A

ASP.NET Core的配置(4):多样性的配置来源[上篇]

较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种...

1876
来自专栏Java编程技术

一个有关定时生产与消费的问题

按照上面的逻辑看的话,每个队列里面最多有一个元素。其实不然,因为在多线程模型中每个线程占用cpu执行的时间是按照时间片来划分的,每个线程执行完自己的时间片后会被...

681
来自专栏微信公众号:Java团长

各大公司Java后端开发面试题总结

ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。 采用空间换时间,它用于线程间的...

861
来自专栏逢魔安全实验室

铁人三项2018 pwn [heapmain] Writeup

这个题目的原题是RHME3,直接拿来二进制修改,去掉网络函数,使用socat部署。这波操作可还行

962
来自专栏机器学习从入门到成神

各大公司Java后端开发面试题总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

1492
来自专栏Jimoer

JVM学习记录-线程安全与锁优化(一)

线程:程序流执行的最小单元。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I...

572
来自专栏互联网开发者交流社区

jsp 内置对象(五)

1145
来自专栏用户画像

指令及操作数的寻址方式

  操作数的寻址:把操作数的形式地址,根据间址和变址等组合变换为操作数有效地址的过程。

1312
来自专栏james大数据架构

高可用高性能分布式文件系统FastDFS实践Java程序

  在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构...

5238

扫码关注云+社区