- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
用xxl-job做后台任务管理, 主要是快速解决定时任务的HA问题, 项目代码量不大, 功能精简, 没有特殊依赖. 因为产品中用到了这个项目, 上午花了点时间研究了一下运行机制. 把看到的记一下. 。
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
运行需要 JDK1.8, MySQL5.7 。
项目文件结构如下 。
├───doc
│ ├───db # 初始化的sql
│ └───images
├───xxl-job-admin # 运行的服务端模块, 提供界面和调度
│ └───src
│ ├───main
│ │ ├───java
│ │ │ └───com
│ │ │ └───xxl
│ │ │ └───job
│ │ │ └───admin
│ │ │ ├───controller
│ │ │ │ ├───annotation
│ │ │ │ ├───interceptor
│ │ │ │ └───resolver
│ │ │ ├───core
│ │ │ ├───dao
│ │ │ └───service
│ │ │ └───impl
│ │ └───resources
│ │ ├───i18n # 多国化, 简繁英
│ │ ├───mybatis-mapper # xml形式的mapper
│ │ ├───static # 前端静态文件
│ │ └───templates # Freemarker模板
│ └───test
│ └───java
│
├───xxl-job-core # 公用jar包, 模块内部依赖
│ └───src
│ └───main
│ └───java
│
└───xxl-job-executor-samples
├───xxl-job-executor-sample-frameless # 任务执行层示例
│ └───src
│ ├───main
│ │ ├───java
│ │ └───resources
│ └───test
│ └───java
└───xxl-job-executor-sample-springboot # 使用SpringBoot的执行层示例
└───src
├───main
│ ├───java
│ └───resources
└───test
执行端需要准备以下信息 。
adminAddresses 服务端地址, 例如 http://127.0.0.1:8080/xxl-job-admin 。
accessToken 貌似是服务端的token, 在调用服务端 api/registry, api/registryRemove 等操作时需要验证 。
appname 执行端名称 。
address 执行端地址, 和 ip:port 二选一, 存在则覆盖 ip:port 。
ip 执行端IP 。
port 执行端服务端口 。
执行端启动后将自己注册到服务端, 等待回调 。
任务执行通过 XxlJobTrigger.processTrigger() 发起, 准备参数, 并在分组中选择一个地址 。
根据这个地址取得 ExecutorBiz, 调用 executorBiz.run() 执行任务 。
服务端: 通过 ExecutorBizClient.
XxlJobRemotingUtil.postBody(addressUrl + "run", accessToken, timeout, triggerParam, String.class);
accessToken
是服务端的accessToken 执行端: 通过 ExecutorBizImpl.run() 。
XxlJobExecutor.loadJobHandler(triggerParam.getExecutorHandler());
得到XxlJob方法 XxlJobExecutor.registJobThread(triggerParam.getJobId(), jobHandler, removeOldReason)
执行 通过调用 FrameLessXxlJobConfig.getInstance().initXxlJobExecutor() 这个方法将 XxlJobSimpleExecutor 实例化, 并注册到xxl_job服务端 。
@Configuration
中, 将 XxlJobSpringExecutor 作为一个 @Bean
添加到 Spring context SmartInitializingSingleton
接口的 afterSingletonsInstantiated()
方法 afterSingletonsInstantiated()
方法中
@XxlJob
注解的方法 registJobHandler()
, 将 @XxlJob
方法添加到 private static ConcurrentMap<String, IJobHandler> jobHandlerRepository
XxlJobExecutor.start()
, 将自己注册到 xxl_job 服务端 xxl_job 并未使用Spring的服务机制, 而是内部实现了一个侦听指定IP+端口的服务. 这个实现对应的类是 EmbedServer, 服务基于 Netty, 核心代码是 。
// start server
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel) throws Exception {
channel.pipeline()
.addLast(new IdleStateHandler(0, 0, 30 * 3, TimeUnit.SECONDS)) // beat 3N, close if idle
.addLast(new HttpServerCodec())
.addLast(new HttpObjectAggregator(5 * 1024 * 1024)) // merge request & reponse to FULL
.addLast(new EmbedHttpServerHandler(executorBiz, accessToken, bizThreadPool));
}
})
.childOption(ChannelOption.SO_KEEPALIVE, true);
这行代码注册了内部的XxlJob方法 。
.addLast(new EmbedHttpServerHandler(executorBiz, accessToken, bizThreadPool)
处理远程请求时, 在下面的代码中, 通过 executorBiz.run(triggerParam) 调用XxlJob方法 。
private Object process(HttpMethod httpMethod, String uri, String requestData, String accessTokenReq) {
//...
// services mapping
try {
switch (uri) {
case "/beat":
return executorBiz.beat();
case "/idleBeat":
IdleBeatParam idleBeatParam = GsonTool.fromJson(requestData, IdleBeatParam.class);
return executorBiz.idleBeat(idleBeatParam);
case "/run":
TriggerParam triggerParam = GsonTool.fromJson(requestData, TriggerParam.class);
return executorBiz.run(triggerParam);
case "/kill":
KillParam killParam = GsonTool.fromJson(requestData, KillParam.class);
return executorBiz.kill(killParam);
case "/log":
LogParam logParam = GsonTool.fromJson(requestData, LogParam.class);
return executorBiz.log(logParam);
default:
return new ReturnT<String>(ReturnT.FAIL_CODE, "invalid request, uri-mapping(" + uri + ") not found.");
}
} catch (Exception e) {
//...
}
通过 select ... for update 实现的, 这个表并没有放到 MyBatis, 在 JobScheduleHelper 中, 通过 。
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
preparedStatement.execute();
得到锁, 在方法末尾释放 。
// close PreparedStatement
if (null != preparedStatement) {
try {
preparedStatement.close();
} catch (SQLException e) {
if (!scheduleThreadToStop) {
logger.error(e.getMessage(), e);
}
}
}
最后此篇关于xxl-job定时调度任务Java代码分析的文章就讲到这里了,如果你想了解更多关于xxl-job定时调度任务Java代码分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对开发领域有点陌生,我正在开发一个 Android 项目。我正在尝试使用手机相机闪光灯。我试图让它以重复的 Action 闪烁。下面是我的 .java 文件中的一个剪辑。 public vo
我正在制作一个 ios 应用程序,它是一种诗集。我想要的功能之一是定时“阅读”,因此一首诗中的单词出现的时间与我阅读时的时间相同。所以我有一个数组,里面有诗中的词,还有延迟。 现在我想遍历单词,在屏幕
这个问题在这里已经有了答案: Loop doesn't see value changed by other thread without a print statement (1 个回答) 关闭
我如何才能使用计时器?例如,我想显示某个文本 10 秒,然后我想在剩余时间内显示不同的文本。 谢谢 凯文 最佳答案 延迟操作的最简单方法是使用 NSObject 的 PerformSelector:w
我在这里的措辞上有点困难,但要点是我使用返回一个对象的 Promise.race (如下所示)。大多数时候,至少有一些 promise 会崩溃,但这是故意的。这仅意味着未找到产品。为了避免 Promi
我正在寻找定时 JDialog,它会在指定时间过后消失,并且找到的代码运行正常。 JFrame f = new JFrame(); final JDia
我试图让选择器在不同的时间轮换,我想我会尝试一个简单的 if/else 语句,让第一个选择器在 3 秒后轮换,接下来的选择器在 30 秒后轮换。然而,它只是每三秒旋转一次。如果我想出了如何完成这项工作
这个问题已经有答案了: How to implement a timer in c? (7 个回答) Creating a Timer in C (2 个回答) 已关闭 9 年前。 我需要根据用户输入
我有一个在我文档的 head 标签中调用的 javascript 文件,每隔 30 秒,我希望重新加载这个 javascript 文件。 我对此做了一些研究,似乎它在提取本地存储的文件副本或跨浏览器问
我想看看运行 bash 函数需要多长时间。在做了一些研究之后,我想出了这种使用子 shell 的方法: function test-function() { time ( rs
我正在使用 jQuery,并且我有一个 aAax 请求,如下所示; $.ajax({ type: 'POST', url: 'test.php',
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我想为系统的每笔交易制定一个程序任务,以预留15分钟的等待时间。如果超过15分钟,程序将改变状态/状态。如果状态在 15 分钟内发生变化,则结束任务。我可以应用更多更好的代码吗?比如Wait/Slee
我正在制作一个打字速度测试程序,它有一个循环需要运行 60 秒然后退出并显示结果。我读过其他关于为 C++ 程序计时的地方,但我的研究没有定论。该程序正在运行 (llbd),我希望有人有解决方案/更好
我试图在一个简单的游戏中每 0.5 - 2 秒随机创建一个障碍。我已经有了创建障碍的功能,但我无法为实例化计时。我试过研究这个,但我还没有想出任何相关的东西。你们能帮帮我吗? 最佳答案 您可以使用 p
我有以下测试,在运行特别长的 fib 断言时不会失败。 未正确失败的测试 #!/usr/env/bin python2.7 import unittest from fib import fib fr
我想知道这是否可行。有没有一种方法可以使用 PHP 每 24 小时更新一次行的值。为什么?我正在创建一个使用在线货币(称为 Yads)的 child 网站。 Row 的值是用户拥有的 Yad 数量。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
有 Cron API 这样的东西吗? 我的意思是,是否有一种编程方式可以在不影响 Cron 的情况下添加/删除 Cron 作业? 最佳答案 UNIX cron 的 API 是文件系统。有一个用于安装/
1、SpringBoot:集成Swagger终极版 学习目标: 了解Swagger的概念及作用 掌握在项目中集成Swagger自动生成API文档 1.1、Sw
我是一名优秀的程序员,十分优秀!