1.预期接口,通过http调用外部接口
2.配置项有url,request,response,每次调用成功后,根据要求保存响应
3.一开始可能只有3个配置,后续要扩展,配置新增后,要求能读取到新的配置,但是代码还是这一个
这个该如何实现呢,我现在是通过将数据库读取到内存,但是后果就是每次只能使用最新的配置,无法读取老的
,使用的是如下技术:
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(getRunnable(scheduleConfigBO), getTrigger(scheduleConfigBO));
private Runnable getRunnable(ScheduleConfigBO config) {
return new Runnable() {
@Override
public void run() {
Class<?> clazz;
// 如果 status 是0 代表暂停 跳过任务
if (config.getStatus().intValue() == 1) {
try {
// 这里通过反射调用方法
clazz = Class.forName(config.getClassName());
String className = lowerFirstCapse(clazz.getSimpleName());
Object bean = ApplicationContextHelper.getBean(className);
Method method = ReflectionUtils.findMethod(bean.getClass(), "run");
ReflectionUtils.invokeMethod(method, bean);
} catch (ClassNotFoundException e) {
LOGGER.error("invoke class: {} has an error ", config.getClassName());
}
}
}
};
}
private Trigger getTrigger(ScheduleConfigBO scheduleConfigBO) {
return new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
CronTrigger trigger = new CronTrigger(scheduleConfigBO.getTaskCron());
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
};
}
/**
* 数据库表为schedule_setting
*/
@Data
public class ScheduleConfigBO {
/**
* 任务名 唯一
*/
private String taskName;
/**
* 任务描述
*/
private String taskDesc;
/**
* 任务表达式
*/
private String taskCron;
/**
* 1 代表开启,0代表关闭
*/
private Integer status;
/**
* 调用类
*/
private String className;
/**
* 需要外部调用的url地址
*/
private String url;
/**
* 需要外部调用的请求(json)
*/
private String request;
/**
* 是否启动标识
*/
private Boolean startFlag;
}
本人已经实现,通过反射,带入bean,方法,以及入参
private Runnable getRunnable(ScheduleConfigBO config) {
return new Runnable() {
@Override
public void run() {
Class<?> clazz;
// 如果 status 是0 代表暂停 跳过任务
if (config.getStatus().intValue() == 1) {
try {
// 这里通过反射调用方法,带入ScheduleConfigBO的参数
clazz = Class.forName(config.getClassName());
String className = lowerFirstCapse(clazz.getSimpleName());
Object bean = ApplicationContextHelper.getBean(className);
Method method = ReflectionUtils.findMethod(bean.getClass(), "run", ScheduleConfigBO.class);
ReflectionUtils.invokeMethod(method, bean, config);
} catch (ClassNotFoundException e) {
LOGGER.error("invoke class: {} has an error ", config.getClassName());
}
}
}
};
}