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方法被调用
*/