添加了GraalVM的原生镜像版本-本地编译版本
-修复了@Resource注入失败导致的程序跑不起来的问题
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -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>
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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}";
|
||||||
|
|||||||
@@ -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(){
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推送晚安
|
* 推送晚安
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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
|
||||||
BIN
target/dailylove
BIN
target/dailylove
Binary file not shown.
Reference in New Issue
Block a user