在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 条评论
登录 后参与评论

相关文章

来自专栏青青天空树

通过163smtp服务器向各大邮箱发送邮件(SOCKET编程)

注意如果是163向163发送邮件,邮件的发送者(mail.sender,不是真实发送者这个必须和认证的用户名相同)可以设置为任意的,这样接收者收到邮件时会看到该...

492
来自专栏编程坑太多

JSONP跨域ajax请求

1012
来自专栏信安之路

利用Java反射和类加载机制绕过JSP后门检测

JSP 后门,一般是指文件名以 .jsp 等后缀结尾的,可运行于 Java servlet 及相关容器和组件内的通用 JSP 脚本。

1310
来自专栏木子墨的前端日常

关于options请求的一点理解

最近最项目改造,对所有的ajax请求统一做了一点处理,发现原来很正经的ajax请求突然不正常了,每个ajax之前都多了一个相应的method为options的请...

1172
来自专栏Java 源码分析

Bootstrap 源码分析

Netty 源码分析: Bootstrap 1. 结构 先看一个这个类的类层次结构, ? 好,这个结构还是比较明晰的,然后看他的主要字段,因为这些字段比较重...

2595
来自专栏技术小讲堂

ASP.NET AJAX(1)__Microsoft AJAX LibraryASP.NET AJAX(1)__Microsoft AJAX Library

ASP.NET AJAX(1)__Microsoft AJAX Library Microsoft AJAX Library为我们提供的客户端框架,提供的内容大...

2774
来自专栏Python爬虫实战

Python爬虫利器:Requests库的使用

写了一些爬虫,从urllib库转到requests库,到目前为止,个人感觉requests库是最简单易用的HTTP库,以下这段话来自requests官网:

491
来自专栏恰同学骚年

《你必须知道的.NET》读书笔记:方法表初窥

  执行Main方法调用时,Three实例的创建与相应类型的加载也随之发生。然而,类型加载是在实例创建之前完成的,也就是我们常常说到的方法表创建。当程序执行到t...

811
来自专栏依乐祝

[译]ASP.NET Core中使用MediatR实现命令和中介者模式

在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此,我们将通...

130
来自专栏偏前端工程师的驿站

页面分部分加载呈现收集(不断更新中)

前言                                      因项目首页内容多,每次点击都会有一段画面空白的时间,使用感不好,于是找找看有没有...

1759

扫码关注云+社区