场景:配置化指标执行方案
业务系统配置一个任务,在任务中选中多个指标,执行对应的方法,将数据结果保存至数据库或者Redis
实例Bean的工具类
package com.dpxdata.backend.param;
import com.baomidou.mybatisplus.extension.exceptions.ApiException;
import com.dpxdata.backend.kbt.util.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.Map;
/**
* @Author: lisaihang
* @Date: 2021/3/19:14:15
*/
@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
@SuppressWarnings("static-access" )
public void setApplicationContext(ApplicationContext contex)
throws BeansException {
// TODO Auto-generated method stub
this.context = contex;
}
public static Object getBean(String beanName){
return context.getBean(beanName);
}
public static Object getBean(Class cl){
return context.getBean(cl);
}
public static String getMessage(String key) {
return context.getMessage(key, null, Locale.getDefault());
}
/**
* 执行动态方法,参数为map 方便实现对应业务
* @param className 类路径
* @param classMethod 方法
* @param params map 参数 将需要的参数放入map中
*/
public static void invoke(String className, String classMethod, Map<String, Object> params) {
Class classN;
try {
classN = Class.forName(className);
Object bean = SpringUtil.getBean(classN);
for (Method method : classN.getMethods()) {
if (classMethod.equals(method.getName())) {
log.info("Time Task ==> 调用实现类{}, 执行时间 {}", className + "." + classMethod, DateUtils.getStrDate());
method.invoke(bean, params);
log.info("Time Task ==> 调用实现类结束{}, 执行时间 {}", className + "." + classMethod, DateUtils.getStrDate());
break;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new ApiException("反射实现类异常!");
} catch (IllegalAccessException e) {
e.printStackTrace();
throw new ApiException("拒绝访问该方法!");
} catch (InvocationTargetException e) {
e.printStackTrace();
throw new ApiException("执行方法异常!");
}
}
}
配置类
package com.dpxdata.backend.param;
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @Author: LiSaiHang
* @Date: 2023/3/9 11:10 上午
*/
@Slf4j
@Component
public class RunService {
public void run(Map<String, Object> params) {
if (CollectionUtil.isNotEmpty(params)) {
// 实际业务处理
log.info(params.get("name").toString());
}
}
}
控制层测试
/**
* @Author: LiSaiHang
* @Date: 2023/3/9 11:07 上午
* {
* "className": "com.dpxdata.backend.param.RunService",
* "jsonParams": "{'name':'张三'}",
* "methodName": "run"
* }
*/
@RestController
public class ParamController {
@PostMapping("/admin/run")
public CommonResult<?> run(@RequestBody ParamModel entity) {
SpringUtil.invoke(entity.getClassName(), entity.getMethodName(), JSON.parseObject(entity.getJsonParams(), HashMap.class));
return CommonResult.success("执行成功");
}
}