XXL-JOB 分布式任务调度系统使用及一些小优化

官网博客地址:https://www.cnblogs.com/xuxueli/p/5021979.html 有详细的操作流程和介绍
环境要求:
JDK:1.7+
Servlet/JSP Spec:3.1/2.3
Tomcat:8.5.x/Jetty9.2.x
Spring-boot:1.5.x/Spring4.x
Mysql:5.6+
Maven:3+
项目分为xxl-job-admin(调度中心) 和 执行器(分布在子项目中的定时任务)

从官网下载下来目录结构如图

在这里插入图片描述
适应我司运维系统,将父子maven项目修改成一个gradle项目,也就是xxl-job-admin 这一个调度中心项目,执行器分布在各个子系统中.调度中心项目基本不需要修改,需修改的是子项目.

执行器项目配置:
config.properties:

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" 
#正式环境我这里用的域名,nginx分发
xxl.job.admin.addresses=http://IP:8080/xxl-job-admin,http://IP:8081/xxl-job-admin
### xxl-job executor address
xxl.job.executor.appname=xxl-job-tradeserver
xxl.job.executor.ip=
xxl.job.executor.port=9998
### xxl-job, access token
xxl.job.accessToken=
### xxl-job log path
xxl.job.executor.logpath=/data/Logs/tradeserver.cfaoe.local
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1

build.gradle 增加如下引用:

//xxl-job star
compile ('com.xuxueli:xxl-job-core:2.0.1')
compile ('com.xuxueli:xxl-rpc-core:1.2.1')
compile ('org.codehaus.groovy:groovy-all:2.4.15')
compile ('org.apache.commons:commons-exec:1.3')
compile ('org.eclipse.jetty:jetty-server:9.2.26.v20180806')
compile ('org.eclipse.jetty:jetty-util:9.2.26.v20180806')
compile ('org.eclipse.jetty:jetty-http:9.2.26.v20180806')
compile ('org.eclipse.jetty:jetty-io:9.2.26.v20180806')
compile ('org.eclipse.jetty:jetty-client:9.2.26.v20180806')
compile ('com.caucho:hessian:4.0.51')
//xxl-job end

项目都修改完,启动可以看到
在这里插入图片描述
各个执行器已经注册到调度中心.

如发现使用不方便的地方可自己修改源码,如:
1.如果定时任务多,间隔短,日志是存库的,数据库日志表数据会非常多.
修改AdminBizImpl.java这个类的callback方法

// success, save log
        log.setHandleTime(new Date());
        log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
        log.setHandleMsg(handleMsg.toString());
        /**
         * 任务执行成功就删除此任务之前的日志,防止数据量过大,只保留最后一次成功日志+错误日志
         * 全部日志去本地的log文件查看
         * songhe.zhang
         * 2018年12月28日11:33:35
         */
        if(log.getHandleCode() == 200 && log.getTriggerCode() == 200) {
            xxlJobLogDao.deleteById(log.getId(),log.getJobGroup(),log.getJobId());
        }
        xxlJobLogDao.updateHandleInfo(log);
        return ReturnT.SUCCESS;

sql

<delete id="deleteById" >
		delete from XXL_JOB_QRTZ_TRIGGER_LOG
		WHERE job_group = #{jobGroup} AND job_id = #{jobId} and handle_code = 200 and trigger_code = 200 AND  id != #{id}
	</delete>

2.使用路由策略(一致hash)+阻塞处理策略(丢弃后续调度) 来预防上次任务未执行完成,就丢弃下次任务,防止重复执行,如果任务调度间隔很短,频繁丢弃,又配置了发邮件功能.那么邮箱就会爆炸了.
主要错误信息是: msg:block strategy effect:Discard Later
修改发邮件类:
JobFailMonitorHelper.java 里的failAlarm方法:

private void failAlarm(XxlJobInfo info, XxlJobLog jobLog){

		// send monitor email
		if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {

			String alarmContent = "Alarm Job LogId=" + jobLog.getId();
			if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
				//如果是Discard Later 不发邮件
				if(jobLog.getTriggerMsg() != null && jobLog.getTriggerMsg().contains("block strategy effect:Discard Later")) {
					return;
				}
				alarmContent += "<br>TriggerMsg=" + jobLog.getTriggerMsg();
			}
			if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
				alarmContent += "<br>HandleCode=" + jobLog.getHandleMsg();
			}

			Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
			for (String email: emailSet) {
				XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));

				String title = I18nUtil.getString("jobconf_monitor");
				String content = MessageFormat.format(mailBodyTemplate,
						group!=null?group.getTitle():"null",
						info.getId(),
						info.getJobDesc(),
						alarmContent);

				MailUtil.sendMail(email, title, content);
			}
		}

		// TODO, custom alarm strategy, such as sms

	}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值