From 002b7ec2c52306ae6ad1b0b5f2efd4fe310ca645 Mon Sep 17 00:00:00 2001 From: sun Date: Tue, 5 Sep 2023 15:38:20 +0800 Subject: [PATCH] feat[net]: graalvm support --- .../com/zfoo/boot/BootAutoConfiguration.java | 4 + .../com/zfoo/boot/NetAutoConfiguration.java | 3 + .../zfoo/boot/graalvm/GraalvmNetHints.java | 80 +++++++++++++++++++ .../boot/graalvm/GraalvmProtocolHints.java | 49 ++++++++++++ .../com/zfoo/net/anno/PacketReceiver.java | 3 + .../com/zfoo/net/router/route/PacketBus.java | 9 ++- 6 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java create mode 100644 boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java diff --git a/boot/src/main/java/com/zfoo/boot/BootAutoConfiguration.java b/boot/src/main/java/com/zfoo/boot/BootAutoConfiguration.java index a8040f63..cb939306 100644 --- a/boot/src/main/java/com/zfoo/boot/BootAutoConfiguration.java +++ b/boot/src/main/java/com/zfoo/boot/BootAutoConfiguration.java @@ -13,18 +13,22 @@ package com.zfoo.boot; import com.fasterxml.jackson.databind.ObjectMapper; +import com.zfoo.boot.graalvm.GraalvmProtocolHints; +import com.zfoo.boot.graalvm.GraalvmStorageHints; import com.zfoo.protocol.util.JsonUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; /** * @author godotg * @version 3.0 */ @Configuration(proxyBeanMethods = false) +@ImportRuntimeHints(GraalvmProtocolHints.class) public class BootAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(BootAutoConfiguration.class); diff --git a/boot/src/main/java/com/zfoo/boot/NetAutoConfiguration.java b/boot/src/main/java/com/zfoo/boot/NetAutoConfiguration.java index 3e168e97..29357ff3 100644 --- a/boot/src/main/java/com/zfoo/boot/NetAutoConfiguration.java +++ b/boot/src/main/java/com/zfoo/boot/NetAutoConfiguration.java @@ -12,6 +12,7 @@ package com.zfoo.boot; +import com.zfoo.boot.graalvm.GraalvmNetHints; import com.zfoo.net.NetContext; import com.zfoo.net.config.ConfigManager; import com.zfoo.net.config.model.NetConfig; @@ -23,6 +24,7 @@ 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; /** * @author godotg @@ -30,6 +32,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration(proxyBeanMethods = false) @ConditionalOnBean(NetConfig.class) +@ImportRuntimeHints(GraalvmNetHints.class) public class NetAutoConfiguration { @Bean diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java new file mode 100644 index 00000000..5d521716 --- /dev/null +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmNetHints.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.boot.graalvm; + +import com.zfoo.net.config.model.NetConfig; +import com.zfoo.net.core.gateway.model.*; +import com.zfoo.net.packet.common.*; +import com.zfoo.net.packet.common.Error; +import com.zfoo.net.router.attachment.*; +import com.zfoo.storage.anno.GraalvmNativeStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; + +import java.util.HashSet; + +/** + * Register runtime hints for the token library + * + * @author godotg + */ +public class GraalvmNetHints implements RuntimeHintsRegistrar { + + private static final Logger logger = LoggerFactory.getLogger(GraalvmNetHints.class); + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + logger.info("net graalvm aot runtime hints register"); + + var classes = new HashSet>(); + classes.add(NetConfig.class); + + // atachment + classes.add(SignalAttachment.class); + classes.add(SignalOnlyAttachment.class); + classes.add(GatewayAttachment.class); + classes.add(UdpAttachment.class); + classes.add(HttpAttachment.class); + classes.add(NoAnswerAttachment.class); + classes.add(AuthUidToGatewayCheck.class); + classes.add(AuthUidToGatewayConfirm.class); + classes.add(AuthUidAsk.class); + classes.add(GatewaySessionInactiveAsk.class); + classes.add(GatewaySynchronizeSidAsk.class); + + // packet + classes.add(Message.class); + classes.add(Error.class); + classes.add(Heartbeat.class); + classes.add(Ping.class); + classes.add(Pong.class); + classes.add(PairIntLong.class); + classes.add(PairLong.class); + classes.add(PairString.class); + classes.add(PairLS.class); + classes.add(TripleLong.class); + classes.add(TripleString.class); + classes.add(TripleLSS.class); + + var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(GraalvmNativeStorage.class)); + classes.addAll(filterClasses); + + HintUtils.registerRelevantClasses(hints, classes); + + var include = "*.xml"; + hints.resources().registerPattern(include); + logger.info("net graalvm aot hints register resources [{}]", include); + } +} diff --git a/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java new file mode 100644 index 00000000..6bdb64a4 --- /dev/null +++ b/boot/src/main/java/com/zfoo/boot/graalvm/GraalvmProtocolHints.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.boot.graalvm; + +import com.zfoo.protocol.anno.Protocol; +import com.zfoo.protocol.xml.XmlModuleDefinition; +import com.zfoo.protocol.xml.XmlProtocolDefinition; +import com.zfoo.protocol.xml.XmlProtocols; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; + +import java.util.HashSet; + +/** + * Register runtime hints for the token library + * + * @author godotg + */ +public class GraalvmProtocolHints implements RuntimeHintsRegistrar { + + private static final Logger logger = LoggerFactory.getLogger(GraalvmProtocolHints.class); + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + logger.info("protocol graalvm aot runtime hints register"); + + var classes = new HashSet>(); + classes.add(XmlProtocols.class); + classes.add(XmlModuleDefinition.class); + classes.add(XmlProtocolDefinition.class); + + var filterClasses = HintUtils.filterAllClass(clazz -> clazz.isAnnotationPresent(Protocol.class)); + classes.addAll(filterClasses); + + HintUtils.registerRelevantClasses(hints, classes); + } +} diff --git a/net/src/main/java/com/zfoo/net/anno/PacketReceiver.java b/net/src/main/java/com/zfoo/net/anno/PacketReceiver.java index 3a217c23..ec57e05b 100644 --- a/net/src/main/java/com/zfoo/net/anno/PacketReceiver.java +++ b/net/src/main/java/com/zfoo/net/anno/PacketReceiver.java @@ -13,6 +13,8 @@ package com.zfoo.net.anno; +import org.springframework.aot.hint.annotation.Reflective; + import java.lang.annotation.*; /** @@ -22,5 +24,6 @@ import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) +@Reflective public @interface PacketReceiver { } diff --git a/net/src/main/java/com/zfoo/net/router/route/PacketBus.java b/net/src/main/java/com/zfoo/net/router/route/PacketBus.java index 432a9460..777059d4 100644 --- a/net/src/main/java/com/zfoo/net/router/route/PacketBus.java +++ b/net/src/main/java/com/zfoo/net/router/route/PacketBus.java @@ -27,6 +27,7 @@ import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.collection.ArrayUtils; import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.util.AssertionUtils; +import com.zfoo.protocol.util.GraalVmUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; import io.netty.util.collection.ShortObjectHashMap; @@ -119,8 +120,12 @@ public abstract class PacketBus { AssertionUtils.isNull(receiverMap.get(protocolId), "duplicate protocol registration, @PacketReceiver [class:{}] is repeatedly received [at{}]", packetClazz.getSimpleName(), packetClazz.getSimpleName()); var receiverDefinition = new PacketReceiverDefinition(bean, method, packetClazz, attachmentClazz); - var enhanceReceiverDefinition = EnhanceUtils.createPacketReceiver(receiverDefinition); - receiverMap.put(protocolId, enhanceReceiverDefinition); + if (GraalVmUtils.isGraalVM()) { + receiverMap.put(protocolId, receiverDefinition); + } else { + var enhanceReceiverDefinition = EnhanceUtils.createPacketReceiver(receiverDefinition); + receiverMap.put(protocolId, enhanceReceiverDefinition); + } } catch (Throwable t) { throw new RunException("Registration protocol [class:{}] unknown exception", packetClazz.getSimpleName(), t); }