feat[graalvm]: storage graalvm support

This commit is contained in:
godotg
2023-09-02 15:55:14 +08:00
parent c1fe64cdb2
commit 5bf5387ffa
8 changed files with 156 additions and 27 deletions
@@ -12,13 +12,24 @@
package com.zfoo.boot;
import com.zfoo.protocol.util.ClassUtils;
import com.zfoo.protocol.util.StringUtils;
import com.zfoo.storage.StorageContext;
import com.zfoo.storage.manager.StorageManager;
import com.zfoo.storage.model.anno.GraalvmNativeResource;
import com.zfoo.storage.model.config.StorageConfig;
import com.zfoo.storage.model.resource.ResourceData;
import com.zfoo.storage.model.resource.ResourceEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aot.hint.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportRuntimeHints;
import java.util.HashSet;
/**
* @author godotg
@@ -26,8 +37,11 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(StorageConfig.class)
@ImportRuntimeHints(StorageAutoConfiguration.StorageHints.class)
public class StorageAutoConfiguration {
private static final Logger logger = LoggerFactory.getLogger(StorageAutoConfiguration.class);
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(StorageConfig.class)
@@ -43,4 +57,46 @@ public class StorageAutoConfiguration {
return new StorageContext();
}
// Register runtime hints for the token library
public static class StorageHints implements RuntimeHintsRegistrar {
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
logger.info("storage aot runtime hints register");
var classes = new HashSet<Class<?>>();
classes.add(ResourceData.class);
try {
for (var className : ClassUtils.getAllClasses("")) {
try {
var clazz = Class.forName(className);
if (!clazz.isAnnotationPresent(GraalvmNativeResource.class)) {
continue;
}
classes.add(clazz);
classes.addAll(ClassUtils.relevantClass(clazz));
} catch (Throwable t) {
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
for (var clazz : classes) {
this.bindingRegistrar.registerReflectionHints(hints.reflection(), clazz);
logger.info("storage aot hints register serialization [{}]", clazz);
}
for (var resource : ResourceEnum.values()) {
var include = StringUtils.format("*.{}", resource.getType());
hints.resources().registerPattern(include);
logger.info("storage aot hints register resources [{}]", include);
}
}
}
}