diff --git a/pom.xml b/pom.xml index d4335ef..7a46557 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ - -H:DashboardDump=dailylove -H:+DashboardAll + -H:+ReportExceptionStackTraces --enable-monitoring=jfr @@ -89,12 +89,12 @@ - + diff --git a/src/main/java/com/bamanker/dailylove/config/ClassReflectConfig.java b/src/main/java/com/bamanker/dailylove/config/ClassReflectConfig.java new file mode 100644 index 0000000..e5c689d --- /dev/null +++ b/src/main/java/com/bamanker/dailylove/config/ClassReflectConfig.java @@ -0,0 +1,138 @@ +package com.bamanker.dailylove.config; + +import cn.hutool.core.util.ClassUtil; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +/** + * 反射将所有项目类扫描加入到服务, 大力出奇迹的操作,感觉不太合适,不过先让服务跑起来 + * + * @author bamanker + */ +@Component +public class ClassReflectConfig { + + static boolean begin = true; + + @Value("${scanclass}") + private Boolean scanclass; + + @Autowired + private ThreadPoolTaskExecutor executorService; + + @PostConstruct + public void init() { + + if (scanclass) { + System.err.println("配置文件下 scanclass 开启了生成反射类"); + } else { + System.err.println("配置文件下 scanclass 关闭了生成反射类"); + } + + synchronized (ClassReflectConfig.class) { + if (begin && scanclass) { + begin = false; + executorService.submit(() -> { + +// { +// // 先抓取上一次的文件,生成 +// try { +// BufferedReader utf8Reader = ResourceUtil +// .getUtf8Reader("classpath:/META-INF/native-image/reflect-config.json"); +// String res = utf8Reader.lines().collect(Collectors.joining()); +// List object = ProJsonUtil.toObject(res, List.class); +// for (Object object2 : object) { +// try { +// Map object22 = (Map) object2; +// handlerClass(Class.forName(ProMapUtil.getStr(object22, "name"))); +// } catch (Exception e) { +// } +// } +// } catch (Exception e) { +// log.error("生成文件异常", e); +// } +// } + + { + // 扫描系统第二级开始的包 + String packageName = ClassReflectConfig.class.getPackageName(); + String proPackageName = packageName.substring(0, + packageName.indexOf(".", packageName.indexOf(".") + 1)); + + // 可以在这个地方,添加除了服务以外其他的包,将会加入反射,以供graalvm生成配置 + List asList = Arrays.asList(proPackageName); + + for (String spn : asList) { + try { + Set> doScan = ClassUtil.scanPackage(spn); + for (Class clazz : doScan) { + handlerClass(clazz); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + + // handlerClass(RedisMessageListenerContainer.class); + + }); + } + } + + + } + + private void handlerClass(Class clazz) { + if (clazz.equals(ClassReflectConfig.class)) { + // 跳过自己,避免形成循环 + return; + } + + executorService.submit(() -> { + try { + System.err.println("反射注入:" + clazz.getName()); + // 生成所有的构造器 + Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); + // 找到无参构造器然后实例化 + Constructor declaredConstructor = clazz.getDeclaredConstructor(); + declaredConstructor.setAccessible(true); + Object newInstance = declaredConstructor.newInstance(); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + try { + // 实例化成功,那么调用一下 + method.setAccessible(true); + // graalvm必须需要声明方法 + method.invoke(newInstance); + } catch (Throwable e) { + } + } + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + try { + field.setAccessible(true); + field.getType(); + String name = field.getName(); + field.get(newInstance); + + } catch (Throwable e) { + } + } + System.err.println("反射注入完成:" + clazz.getName()); + } catch (Throwable e) { + } + }); + } + +} diff --git a/src/main/java/com/bamanker/dailylove/config/DailyLoveConfigure.java b/src/main/java/com/bamanker/dailylove/config/DailyLoveConfigure.java index 8062298..b7263b7 100644 --- a/src/main/java/com/bamanker/dailylove/config/DailyLoveConfigure.java +++ b/src/main/java/com/bamanker/dailylove/config/DailyLoveConfigure.java @@ -5,7 +5,6 @@ import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; @Component -@RefreshScope public class DailyLoveConfigure { // public static String Access_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; // public static String Send_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}"; diff --git a/src/main/java/com/bamanker/dailylove/config/PushTask.java b/src/main/java/com/bamanker/dailylove/config/PushTask.java index eb7877c..910acfc 100644 --- a/src/main/java/com/bamanker/dailylove/config/PushTask.java +++ b/src/main/java/com/bamanker/dailylove/config/PushTask.java @@ -8,9 +8,13 @@ import org.springframework.stereotype.Component; @Component public class PushTask { - @Autowired + final PushDailyController pushDailyController; + public PushTask(PushDailyController pushDailyController) { + this.pushDailyController = pushDailyController; + } + //每日 早上7.30,晚上22点 定时推送 @Scheduled(cron = "0 30 7 * * ?") public void scheduledPushMorning(){ diff --git a/src/main/java/com/bamanker/dailylove/controller/PushDailyController.java b/src/main/java/com/bamanker/dailylove/controller/PushDailyController.java index 4fcd4e7..e9a8e2a 100644 --- a/src/main/java/com/bamanker/dailylove/controller/PushDailyController.java +++ b/src/main/java/com/bamanker/dailylove/controller/PushDailyController.java @@ -9,6 +9,7 @@ import com.bamanker.dailylove.service.DataRemoteClient; import com.bamanker.dailylove.service.WechatRequestClient; import com.bamanker.dailylove.utils.DataUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,12 +21,17 @@ import java.util.Date; @RestController public class PushDailyController { - @Resource + final DataRemoteClient dataRemoteClient; - @Resource + final WechatRequestClient wechatRequestClient; + public PushDailyController(DataRemoteClient dataRemoteClient, WechatRequestClient wechatRequestClient) { + this.dataRemoteClient = dataRemoteClient; + this.wechatRequestClient = wechatRequestClient; + } + /** * 推送晚安 * diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 67e4d45..53fe810 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,6 +4,9 @@ server: spring: application: name: dailyLove + cloud: + refresh: + enabled: false DL: tianxin-key: 72fbbb9e75e338ea6a240e83972f287c @@ -49,4 +52,6 @@ tianxin: logging: level: - com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口(可多个) \ No newline at end of file + com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口(可多个) + +scanclass: false \ No newline at end of file diff --git a/target/dailylove b/target/dailylove index 67f2df6..cbf084e 100755 Binary files a/target/dailylove and b/target/dailylove differ