添加了GraalVM的原生镜像版本-本地编译版本

-修复了@Resource注入失败导致的程序跑不起来的问题
This commit is contained in:
bamanker
2023-11-13 15:30:11 +08:00
parent af50397afb
commit b79710a1fc
7 changed files with 160 additions and 8 deletions

View File

@@ -74,7 +74,7 @@
<configuration> <configuration>
<buildArgs> <buildArgs>
<!--开启dashboard--> <!--开启dashboard-->
<arg>-H:DashboardDump=dailylove -H:+DashboardAll</arg> <!-- <arg>-H:DashboardDump=dailylove -H:+DashboardAll</arg>-->
<arg->-H:+ReportExceptionStackTraces</arg-> <arg->-H:+ReportExceptionStackTraces</arg->
<!--开启JFR--> <!--开启JFR-->
<arg>--enable-monitoring=jfr</arg> <arg>--enable-monitoring=jfr</arg>
@@ -89,12 +89,12 @@
<!--配置jvm参数--> <!--配置jvm参数-->
<!-- <jvmArgs> <!-- <jvmArgs>
</jvmArgs>--> </jvmArgs>-->
<agent> <!--<agent>
<enabled>true</enabled> <enabled>true</enabled>
<options> <options>
<option>experimental-class-loader-support</option> <option>experimental-class-loader-support</option>
</options> </options>
</agent> </agent>-->
</configuration> </configuration>
</plugin> </plugin>

View File

@@ -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<String> asList = Arrays.asList(proPackageName);
for (String spn : asList) {
try {
Set<Class<?>> 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) {
}
});
}
}

View File

@@ -5,7 +5,6 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RefreshScope
public class DailyLoveConfigure { 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 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}"; // public static String Send_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}";

View File

@@ -8,9 +8,13 @@ import org.springframework.stereotype.Component;
@Component @Component
public class PushTask { public class PushTask {
@Autowired final
PushDailyController pushDailyController; PushDailyController pushDailyController;
public PushTask(PushDailyController pushDailyController) {
this.pushDailyController = pushDailyController;
}
//每日 早上7.30,晚上22点 定时推送 //每日 早上7.30,晚上22点 定时推送
@Scheduled(cron = "0 30 7 * * ?") @Scheduled(cron = "0 30 7 * * ?")
public void scheduledPushMorning(){ public void scheduledPushMorning(){

View File

@@ -9,6 +9,7 @@ import com.bamanker.dailylove.service.DataRemoteClient;
import com.bamanker.dailylove.service.WechatRequestClient; import com.bamanker.dailylove.service.WechatRequestClient;
import com.bamanker.dailylove.utils.DataUtils; import com.bamanker.dailylove.utils.DataUtils;
import lombok.extern.slf4j.Slf4j; 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.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -20,12 +21,17 @@ import java.util.Date;
@RestController @RestController
public class PushDailyController { public class PushDailyController {
@Resource final
DataRemoteClient dataRemoteClient; DataRemoteClient dataRemoteClient;
@Resource final
WechatRequestClient wechatRequestClient; WechatRequestClient wechatRequestClient;
public PushDailyController(DataRemoteClient dataRemoteClient, WechatRequestClient wechatRequestClient) {
this.dataRemoteClient = dataRemoteClient;
this.wechatRequestClient = wechatRequestClient;
}
/** /**
* 推送晚安 * 推送晚安
* *

View File

@@ -4,6 +4,9 @@ server:
spring: spring:
application: application:
name: dailyLove name: dailyLove
cloud:
refresh:
enabled: false
DL: DL:
tianxin-key: 72fbbb9e75e338ea6a240e83972f287c tianxin-key: 72fbbb9e75e338ea6a240e83972f287c
@@ -50,3 +53,5 @@ tianxin:
logging: logging:
level: level:
com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口可多个 com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口可多个
scanclass: false

Binary file not shown.