1. 同步对外统一的接口
public class SyncController {
@Autowired
// 注入ApplicationContext的Bean工厂类
private ApplicationContext applicationContext;
/**
*
* @param jobName
* @param executeParam
* @return
* @throws Exception
*/
@GetMapping("/baseDataSync")
public ReturnT<String> baseDataSync(@RequestParam String jobName,
@RequestParam String executeParam) throws Exception {
// 通过ApplicationContext根据类的全限定名获取IJobHandler对象实例
IJobHandler jobHandler = (IJobHandler) applicationContext.getBean(jobName);
return jobHandler.execute(executeParam);
}
}
1. 相关入参
-
jobName:ApplicationContext需要根据这个jobName获取实例,之后才能调用对应的execute方法。
-
executeParam:执行的方法
jobHandler的execute方法只能接收String类型的入参,所以我们需要把传过来的executeParam封装成一个String
2. IJobHandler抽象类(xxl-job自带的)
IJobHandler类是xxl-job自带的一个JOB执行器的抽象类,源码如下:
package com.xxl.job.core.handler;
import com.xxl.job.core.biz.model.ReturnT;
import java.lang.reflect.InvocationTargetException;
/**
* job handler
*
*/
public abstract class IJobHandler {
// 成功标志
public static final ReturnT<String> SUCCESS = new ReturnT<String>(200, null);
// 失败标志
public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
// 超时失败标志
public static final ReturnT<String> FAIL_TIMEOUT = new ReturnT<String>(502, null);
/**
* execute handler, invoked when executor receives a scheduling request
*
* @param param
* @return
* @throws Exception
*/
public abstract ReturnT<String> execute(String param) throws Exception;
// 初始化执行器的时候操作
public void init() throws InvocationTargetException, IllegalAccessException {
}
// 销毁执行器前进行的操作
public void destroy() throws InvocationTargetException, IllegalAccessException {
}
}
我们需要继承IJobHandler实现我们自定义的JobHandler
3. 自定义JobHandler(继承IJobHandler抽象类)
继承IJobHandler抽象类。需要重写其抽象方法execute
@Component
public class BaseDataSyncHandler extends IJobHandler {
@Resource
private ApplicationContext applicationContext;
// 这里定义的value值可以在xxl-job的可视化平台上去配置
@XxlJob(value = "baseDataSyncHandler")
public ReturnT<String> execute(String executeParam) throws Exception {
// DataSync是一个接口,executeParam是具体的实现类的名称
DataSync dataSync = applicationContext.getBean(executeParam, DataSync.class);
// 记录开始之间
long startTime = System.currentTimeMillis();
// executeParam指定的实现类调用对应的sync方法
dataSync.sync();
long endTime = System.currentTimeMillis() - startT;
XxlJobLogger.log("本次执行耗时:{}ms", endTime - startTime);
}
如果只是需要将一个方法采用定时任务的形式的话,写到这里就OK了,execute方法里面只要写具体的实现操作就可以,
但是对于同步数据中心的情况,可能在数据中心有非常多的表是要同步的,对于这种情况,可以用同一个JobHandler,定义一个统一访问的DataSync类,入参是具体的实现类名称,这样就可以调用入参指定的方法
4. 定义一个数据同步的接口DataSync
public interface DataSync {
// 定义一个实现类
boolean sync();
}
5. 编写具体实现类(实现DataSync)
这个类就是用来开发实际的业务操作了,比如同步数据中心接口的操作
@Component("testDataSync")
@Slf4j
public class TestDataSync implements DataSync {
@Resource
private FeignService feignService;
/**
* 具体的实现方法(如:调用三方接口获取数据、调用失败异常处理、数据落库、打印日志等)
*/
public boolean sync() {
...
// 通过Feign调用的方式从数据中心获取数据
feignService.invoke();
...
}
}
6. 可视化操作界面