diff --git a/docs/native-image.md b/docs/native-image.md index f1c8470a4..a06530814 100644 --- a/docs/native-image.md +++ b/docs/native-image.md @@ -1 +1,40 @@ -文档完善中…… \ No newline at end of file +# 使用native-image +   Redkale支持GraalVM的native-image, 由于Redkale使用了大量的asm动态生成代码,而native-image不支持动态字节码,因此需要使用```redkale-maven-plugin```执行预编译,提前生成动态字节码进行打包。 + +## 安装GraalVM +``` + 下载地址: https://www.graalvm.org/downloads/ +``` + +## 安装native-image +``` + install native-image +``` + +## 配置pom +```xml + + org.redkale.maven.plugins + redkale-maven-plugin + 1.2.0 + + + --no-fallback + + + + + redkale-compile + process-classes + + compile + + + + +``` + +## native-image编译 +``` + native-image -H:+ReportExceptionStackTraces --report-unsupported-elements-at-runtime -jar xxx.jar +``` \ No newline at end of file diff --git a/src/main/java/org/redkale/net/AsyncNioTcpProtocolServer.java b/src/main/java/org/redkale/net/AsyncNioTcpProtocolServer.java index f178af230..586162778 100644 --- a/src/main/java/org/redkale/net/AsyncNioTcpProtocolServer.java +++ b/src/main/java/org/redkale/net/AsyncNioTcpProtocolServer.java @@ -12,6 +12,7 @@ import java.util.Set; import java.util.concurrent.atomic.LongAdder; import java.util.function.*; import java.util.logging.Level; +import org.redkale.annotation.Nullable; import org.redkale.boot.Application; import org.redkale.util.*; @@ -81,7 +82,7 @@ class AsyncNioTcpProtocolServer extends ProtocolServer { } @Override - public void accept(Application application, Server server) throws IOException { + public void accept(@Nullable Application application, Server server) throws IOException { this.serverChannel.register(this.selector, SelectionKey.OP_ACCEPT); LongAdder createBufferCounter = new LongAdder(); @@ -103,7 +104,7 @@ class AsyncNioTcpProtocolServer extends ProtocolServer { ObjectPool pool = localResponsePool.get(); return pool == null ? safeResponsePool.get() : pool.get(); }; - this.responseConsumer = (v) -> { + this.responseConsumer = v -> { WorkThread thread = v.channel != null ? v.channel.getWriteIOThread() : v.thread; if (thread != null && !thread.inCurrThread()) { thread.execute(() -> { diff --git a/src/main/java/org/redkale/net/AsyncNioUdpProtocolServer.java b/src/main/java/org/redkale/net/AsyncNioUdpProtocolServer.java index b5a1df43e..b194b4092 100644 --- a/src/main/java/org/redkale/net/AsyncNioUdpProtocolServer.java +++ b/src/main/java/org/redkale/net/AsyncNioUdpProtocolServer.java @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.locks.ReentrantLock; import java.util.function.*; import java.util.logging.Level; +import org.redkale.annotation.Nullable; import org.redkale.boot.Application; import org.redkale.util.*; @@ -84,7 +85,7 @@ class AsyncNioUdpProtocolServer extends ProtocolServer { } @Override - public void accept(Application application, Server server) throws IOException { + public void accept(@Nullable Application application, Server server) throws IOException { LongAdder createBufferCounter = new LongAdder(); LongAdder cycleBufferCounter = new LongAdder(); diff --git a/src/main/java/org/redkale/net/ProtocolServer.java b/src/main/java/org/redkale/net/ProtocolServer.java index 6c6e4df1e..6a7ff05af 100644 --- a/src/main/java/org/redkale/net/ProtocolServer.java +++ b/src/main/java/org/redkale/net/ProtocolServer.java @@ -27,7 +27,7 @@ public abstract class ProtocolServer { //最大连接数,小于1表示无限制 protected int maxConns; - @Resource + @Resource(required = false) //独立创建HttpServer时没有Application protected Application application; public abstract void open(AnyValue config) throws IOException; diff --git a/src/main/java/org/redkale/net/http/HttpServer.java b/src/main/java/org/redkale/net/http/HttpServer.java index 336ec9ccd..513ae4b4a 100644 --- a/src/main/java/org/redkale/net/http/HttpServer.java +++ b/src/main/java/org/redkale/net/http/HttpServer.java @@ -5,7 +5,7 @@ */ package org.redkale.net.http; -import org.redkale.mq.spi.MessageAgent; +import java.io.IOException; import java.lang.reflect.Field; import java.net.HttpCookie; import java.text.*; @@ -15,11 +15,12 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.logging.Level; import org.redkale.boot.Application; import org.redkale.inject.ResourceFactory; -import org.redkale.mq.*; +import org.redkale.mq.spi.MessageAgent; import org.redkale.net.Server; import org.redkale.net.http.HttpContext.HttpContextConfig; import org.redkale.net.http.HttpResponse.HttpResponseConfig; @@ -188,6 +189,37 @@ public class HttpServer extends Server consumer) { + this.dispatcher.addServlet(new HttpServlet() { + @Override + public void execute(HttpRequest request, HttpResponse response) throws IOException { + consumer.accept(request, response); + } + }, null, null, mapping); + return this; + } + /** * 添加HttpServlet * diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java index 59d0dca6e..b7838089d 100644 --- a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java +++ b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java @@ -13,6 +13,7 @@ import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -122,6 +123,14 @@ public class ScheduleManagerService implements ScheduleManager, Service { } } + public void onServersPreStart() { + //do nothing + } + + public void onServersPostStart() { + //do nothing + } + @Override public void schedule(Object service) { lock.lock(); @@ -336,7 +345,7 @@ public class ScheduleManagerService implements ScheduleManager, Service { return c; } - protected abstract class ScheduledTask implements Runnable { + protected abstract class ScheduledTask { protected final WeakReference ref; @@ -350,6 +359,11 @@ public class ScheduleManagerService implements ScheduleManager, Service { protected final ScheduleEvent event; + protected final Map eventMap; + + //任务是否正运行中 + protected final AtomicBoolean doing = new AtomicBoolean(); + protected ScheduledTask(WeakReference ref, String name, Method method) { Objects.requireNonNull(ref); Objects.requireNonNull(name); @@ -357,7 +371,8 @@ public class ScheduleManagerService implements ScheduleManager, Service { this.ref = ref; this.name = name; this.method = method; - this.event = method.getParameterCount() == 0 ? null : new ScheduleEvent(); + this.eventMap = method.getParameterCount() == 0 ? null : new HashMap<>(); + this.event = eventMap == null ? null : new ScheduleEvent(eventMap); } public void init() { @@ -374,6 +389,14 @@ public class ScheduleManagerService implements ScheduleManager, Service { this.started.set(false); } + public boolean doing() { + return doing.get(); + } + + public Map eventMap() { + return eventMap; + } + public Method method() { return method; } @@ -383,7 +406,7 @@ public class ScheduleManagerService implements ScheduleManager, Service { } } - protected class FixedTask extends ScheduledTask { + protected class FixedTask extends ScheduledTask implements Runnable { private final Function delegate; @@ -406,10 +429,13 @@ public class ScheduleManagerService implements ScheduleManager, Service { @Override public void run() { + doing.set(true); try { delegate.apply(event); } catch (Throwable t) { logger.log(Level.SEVERE, "schedule task error", t); + } finally { + doing.set(false); } if (ref.get() == null) { stop(); @@ -430,7 +456,7 @@ public class ScheduleManagerService implements ScheduleManager, Service { } } - protected class CronTask extends ScheduledTask { + protected class CronTask extends ScheduledTask implements Runnable { private final Function delegate; @@ -448,10 +474,13 @@ public class ScheduleManagerService implements ScheduleManager, Service { @Override public void run() { + doing.set(true); try { delegate.apply(event); } catch (Throwable t) { logger.log(Level.SEVERE, "schedule task error", t); + } finally { + doing.set(false); } start(); } diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java b/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java index 00d283377..baf7098cc 100644 --- a/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java +++ b/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java @@ -86,6 +86,26 @@ public class ScheduleModuleEngine extends ModuleEngine { this.scheduleManager.unschedule(service); } + /** + * 服务全部启动前被调用 + */ + @Override + public void onServersPreStart() { + if (this.scheduleManager instanceof ScheduleManagerService) { + ((ScheduleManagerService) this.scheduleManager).onServersPreStart(); + } + } + + /** + * 服务全部启动后被调用 + */ + @Override + public void onServersPostStart() { + if (this.scheduleManager instanceof ScheduleManagerService) { + ((ScheduleManagerService) this.scheduleManager).onServersPostStart(); + } + } + /** * 进入Application.shutdown方法被调用 */