钟情建网站公司济南建设网建筑市场信用信息管理平台
2026/4/18 17:25:44 网站建设 项目流程
钟情建网站公司,济南建设网建筑市场信用信息管理平台,wordpress 登录弹窗,WordPress未设置密码用户前言 在分布式系统架构日益普及的今天#xff0c;任务调度作为企业级应用中不可或缺的功能模块#xff0c;其重要性不言而喻。无论是定时发送优惠券、信用卡还款提醒#xff0c;还是财务数据统计汇总#xff0c;都需要一个可靠、高效的任务调度系统来支撑。本文将详细介绍…前言在分布式系统架构日益普及的今天任务调度作为企业级应用中不可或缺的功能模块其重要性不言而喻。无论是定时发送优惠券、信用卡还款提醒还是财务数据统计汇总都需要一个可靠、高效的任务调度系统来支撑。本文将详细介绍大众点评开源的分布式任务调度平台——XXL-Job帮助读者快速掌握其核心概念与实战应用。一、为什么需要分布式任务调度1.1 任务调度的业务场景在深入XXL-Job之前我们先来看几个典型的业务场景电商平台每天上午10点、下午3点、晚上8点批量发放优惠券银行系统信用卡到期还款日前三天自动发送短信提醒财务系统每天凌晨0:10分自动结算前一天的财务数据并生成统计报表这些都是任务调度需要解决的核心问题在约定的特定时刻自动完成特定任务。1.2 单机调度的局限性Spring框架提供了Scheduled注解来实现简单的定时任务Scheduled(cron 0/20 * * * * ? ) public void doWork(){ // 业务逻辑 }虽然在单机环境下这种方式可以工作但在生产环境中却存在明显的不足问题一高可用性差单机版定时任务只能在一台机器上运行一旦该机器出现程序异常或系统故障整个调度功能将完全不可用。问题二重复执行风险在集群部署环境下如果每台服务实例都运行相同的定时任务就会导致任务在同一时间被多次执行造成数据混乱和业务错误。问题三单机处理能力瓶颈原本1分钟处理1万个订单现在需要处理10万个订单原本需要1小时的统计任务业务方要求10分钟完成虽然可以通过多线程、多进程优化单机处理效率但CPU、内存、磁盘等物理资源始终存在上限单机处理能力终将达到瓶颈。1.3 XXL-Job的核心优势XXL-Job是大众点评开源的轻量级分布式任务调度平台其核心设计目标包括✅开发迅速简单易用快速集成✅学习简单清晰的项目结构完善的文档✅轻量级最小化依赖易于部署✅易扩展支持灵活的定制和扩展生产验证大众点评内部已接入约100万次调度任务表现优异。同时已被京东、360金融、联想集团、易信网易等多家知名企业采用。二、XXL-Job架构设计2.1 系统架构┌─────────────────────────────────────────────────┐ │ 调度中心 │ │ - 任务管理 │ │ - 调度触发 │ │ - 日志监控 │ └─────────────────┬───────────────────────────────┘ │ 调度请求 ▼ ┌─────────────────────────────────────────────────┐ │ 执行器集群 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │Executor-1│ │Executor-2│ │Executor-3│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ └───────────┴───────────┘ │ │ JobHandler │ └─────────────────────────────────────────────────┘2.2 设计思想XXL-Job采用了调度与执行分离的架构设计调度中心公共平台负责发起调度请求管理任务配置监控执行状态不承担具体业务逻辑执行器任务执行单元统一管理分散的JobHandler接收调度请求执行具体业务逻辑回调执行结果这种设计实现了调度与任务的解耦大大提高了系统的整体稳定性和扩展性。三、快速入门实战3.1 环境准备3.1.1 下载源码# GitHub地址 https://github.com/xuxueli/xxl-job # Gitee地址国内推荐 https://gitee.com/xuxueli0323/xxl-job3.1.2 初始化数据库执行项目中的SQL脚本/xxl-job/doc/db/tables_xxl_job.sql这将创建调度中心所需的数据库表结构。3.2 部署调度中心3.2.1 修改配置文件编辑xxl-job-admin/src/main/resources/application.properties### 服务端口 server.port8080 server.servlet.context-path/xxl-job-admin ### 数据源配置重点修改 spring.datasource.urljdbc:mysql://192.168.202.200:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.passwordyour_password spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver ### 访问令牌执行器需要配置一致 xxl.job.accessTokendefault_token ### 日志保留天数 xxl.job.logretentiondays303.2.2 启动调度中心运行XxlJobAdminApplication主程序。访问地址http://localhost:8080/xxl-job-admin默认账号admin / 1234563.3 开发执行器项目3.3.1 添加依赖dependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.3.1/version /dependency3.3.2 配置文件### 调度中心地址多个用逗号分隔 xxl.job.admin.addresseshttp://127.0.0.1:8080/xxl-job-admin ### 通讯令牌需与调度中心一致 xxl.job.accessTokendefault_token ### 执行器应用名称 xxl.job.executor.appnamexxl-job-executor-sample ### 执行器IP默认自动获取 xxl.job.executor.ip ### 执行器端口默认9999多实例需不同端口 xxl.job.executor.port9999 ### 日志路径 xxl.job.executor.logpath/data/applogs/xxl-job/jobhandler ### 日志保留天数 xxl.job.executor.logretentiondays303.3.3 执行器配置类Configuration public class XxlJobConfig { Value(${xxl.job.admin.addresses}) private String adminAddresses; Value(${xxl.job.accessToken}) private String accessToken; Value(${xxl.job.executor.appname}) private String appname; Value(${xxl.job.executor.ip}) private String ip; Value(${xxl.job.executor.port}) private int port; Value(${xxl.job.executor.logpath}) private String logPath; Value(${xxl.job.executor.logretentiondays}) private int logRetentionDays; Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }3.3.4 编写任务处理器Component public class SimpleXxlJob { XxlJob(demoJobHandler) public void demoJobHandler() throws Exception { System.out.println(执行定时任务执行时间 new Date()); } }3.4 配置并执行任务登录调度中心进入任务管理 → 新增任务配置任务参数JobHandlerdemoJobHandlerCron表达式0/20 * * * * ?每20秒执行一次路由策略第一个启动任务在调度日志中可查看任务执行状态和详细日志。四、高级特性4.1 GLUE模式JavaGLUE模式允许任务以源码方式维护在调度中心支持在线编辑和实时编译无需重启执行器。实战步骤1. 定义业务ServiceService public class HelloService { public void methodA() { System.out.println(执行MethodA的方法); } public void methodB() { System.out.println(执行MethodB的方法); } }2. 创建GLUE任务在调度中心新增任务运行模式选择GLUE模式(Java)。3. 在线编写代码点击GLUE IDE编写任务代码package com.xxl.job.service.handler; import cn.wolfcode.xxljobdemo.service.HelloService; import com.xxl.job.core.handler.IJobHandler; import org.springframework.beans.factory.annotation.Autowired; public class DemoGlueJobHandler extends IJobHandler { Autowired private HelloService helloService; Override public void execute() throws Exception { helloService.methodA(); } }优势无需重启应用即可修改任务逻辑支持Spring依赖注入适合频繁变更的业务规则4.2 执行器集群与路由策略4.2.1 搭建集群环境在IDEA中配置多个启动实例修改端口参数实例1-Dserver.port8090 -Dxxl.job.executor.port9998实例2-Dserver.port8091 -Dxxl.job.executor.port99994.2.2 路由策略详解XXL-Job提供了10种丰富的路由策略策略名称说明FIRST固定选择第一个机器LAST固定选择最后一个机器ROUND轮询依次选择在线机器RANDOM随机选择在线机器CONSISTENT_HASH一致性Hash每个任务按Hash算法固定选择某一台机器LEAST_FREQUENTLY_USED使用频率最低的机器优先LEAST_RECENTLY_USED最久未使用的机器优先FAILOVER故障转移按顺序进行心跳检测第一个成功的机器作为目标BUSYOVER忙碌转移按顺序进行空闲检测第一个空闲的机器作为目标SHARDING_BROADCAST分片广播广播触发所有机器自动传递分片参数推荐配置一般定时任务ROUND轮询或RANDOM随机高可用要求FAILOVER故障转移大数据量处理SHARDING_BROADCAST分片广播五、分片广播实战5.1 业务场景需求在指定节假日给平台所有用户假设200万用户发送祝福短信。传统方案问题单机处理200万条数据耗时超过20分钟数据量大容易触发超时无法充分利用集群资源5.2 分片原理分片广播模式会触发集群中所有执行器同时执行任务并自动传递分片参数int shardIndex XxlJobHelper.getShardIndex(); // 当前分片索引从0开始 int shardTotal XxlJobHelper.getShardTotal(); // 总分片数分片策略通过取模算法将数据均匀分配到各个执行器SELECT * FROM t_user WHERE MOD(id, #{shardTotal}) #{shardIndex}5.3 实战实现5.3.1 数据准备CREATE TABLE t_user_mobile_plan ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) DEFAULT NULL, nickname varchar(100) DEFAULT NULL, phone varchar(20) DEFAULT NULL, info varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;5.3.2 实体类Data public class UserMobilePlan { private Long id; private String username; private String nickname; private String phone; private String info; }5.3.3 Mapper接口Mapper public interface UserMobilePlanMapper { // 分片查询 Select(SELECT * FROM t_user_mobile_plan WHERE MOD(id, #{shardingTotal}) #{shardingIndex}) ListUserMobilePlan selectByMod( Param(shardingIndex) Integer shardingIndex, Param(shardingTotal) Integer shardingTotal ); // 全量查询 Select(SELECT * FROM t_user_mobile_plan) ListUserMobilePlan selectAll(); }5.3.4 分片任务实现Component public class MessageJobHandler { Autowired private UserMobilePlanMapper userMobilePlanMapper; XxlJob(sendMsgShardingHandler) public void sendMsgShardingHandler() throws Exception { Date startTime new Date(); System.out.println(任务开始时间 startTime); // 获取分片参数 int shardTotal XxlJobHelper.getShardTotal(); int shardIndex XxlJobHelper.getShardIndex(); // 根据分片情况查询数据 ListUserMobilePlan users; if (shardTotal 1) { // 单机模式查询所有数据 users userMobilePlanMapper.selectAll(); } else { // 集群模式按分片查询 users userMobilePlanMapper.selectByMod(shardIndex, shardTotal); } System.out.println(String.format(分片[%d/%d]处理任务数量%d, shardIndex 1, shardTotal, users.size())); long startMillis System.currentTimeMillis(); // 模拟发送短信 users.forEach(user - { try { // 模拟短信发送耗时 TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } }); long costTime System.currentTimeMillis() - startMillis; System.out.println(任务结束时间 new Date()); System.out.println(任务耗时 costTime 毫秒); } }5.3.5 任务配置JobHandlersendMsgShardingHandler路由策略SHARDING_BROADCAST分片广播Cron根据业务需求设置5.4 性能对比场景执行器数量数据量耗时单机模式12000条约20秒分片模式22000条约10秒分片模式42000条约5秒结论通过分片广播处理时间与执行器数量成反比大幅提升任务执行效率。六、项目集成最佳实践6.1 配置中心化管理建议将XXL-Job配置集中管理xxl: job: admin: addresses: http://xxl-job-admin:8080/xxl-job-admin executor: appname: ${spring.application.name} port: ${xxl.job.executor.port:9999} logpath: /data/applogs/xxl-job/jobhandler logretentiondays: 30 accessToken: ${XXL_JOB_ACCESS_TOKEN:default_token}6.2 任务命名规范// 推荐模块 功能 Handler XxlJob(order_sendCouponHandler) public void sendCouponHandler() { } XxlJob(report_generateDailyHandler) public void generateDailyHandler() { }6.3 异常处理XxlJob(processDataHandler) public void processDataHandler() { try { // 业务逻辑 doProcess(); // 成功日志 XxlJobHelper.handleSuccess(任务执行成功); } catch (Exception e) { // 失败日志 XxlJobHelper.handleFail(任务执行失败 e.getMessage()); log.error(任务执行异常, e); } }6.4 监控告警建议结合以下方式进行监控XXL-Job内置告警配置邮件告警日志监控ELK收集执行日志业务监控记录任务执行记录到监控表七、总结XXL-Job作为一款优秀的分布式任务调度平台具有以下核心优势架构清晰调度与执行分离职责明确功能完善支持GLUE模式、分片广播、多种路由策略易于集成Spring Boot starter方式快速接入运维友好提供Web管理界面操作简单高可用性支持集群部署故障自动转移适用场景定时数据统计与报表生成批量数据处理如短信、邮件推送定期数据同步与清理分布式数据处理任务通过本文的学习相信读者已经掌握了XXL-Job的核心用法。在实际项目中建议结合业务特点选择合适的路由策略充分利用分片广播能力提升任务执行效率同时做好监控告警确保系统稳定运行。参考资料XXL-Job官方文档https://www.xuxueli.com/xxl-job/GitHub地址https://github.com/xuxueli/xxl-jobGitee地址https://gitee.com/xuxueli0323/xxl-job

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询