Skip to content

Commit e0aed41

Browse files
BootController.login will call preLogin() and postLogin() before and after signing JWT (#290)
1 parent fcd5f98 commit e0aed41

File tree

15 files changed

+162
-98
lines changed

15 files changed

+162
-98
lines changed

pom.xml

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>org.summerboot</groupId>
66
<artifactId>jexpress</artifactId>
7-
<version>2.4.17</version>
7+
<version>2.4.18</version>
88
<packaging>jar</packaging>
99
<name>Summer Boot jExpress</name>
1010
<description>Summer Boot jExpress focuses on solving non-functional and operational maintainability requirements,
@@ -58,20 +58,29 @@
5858
</profile>
5959
<profile>
6060
<id>release</id>
61+
<properties>
62+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
63+
<maven.compiler.release>17</maven.compiler.release>
64+
<maven-scm.version>2.1.0</maven-scm.version>
65+
<maven-source.version>3.3.1</maven-source.version>
66+
<maven-javadoc.version>3.11.2</maven-javadoc.version>
67+
<maven-deploy.version>3.1.3</maven-deploy.version>
68+
<maven-gpg.version>3.2.7</maven-gpg.version>
69+
<nexus-staging-maven-plugin.version>1.7.0</nexus-staging-maven-plugin.version>
70+
</properties>
6171
<build>
6272
<plugins>
63-
6473
<plugin>
6574
<groupId>org.apache.maven.plugins</groupId>
6675
<artifactId>maven-scm-plugin</artifactId>
6776
<!-- <version>1.12.2</version> -->
68-
<version>2.1.0</version>
77+
<version>${maven-scm.version}</version>
6978
</plugin>
7079
<!--Source-->
7180
<plugin>
7281
<groupId>org.apache.maven.plugins</groupId>
7382
<artifactId>maven-source-plugin</artifactId>
74-
<version>3.3.1</version>
83+
<version>${maven-source.version}</version>
7584
<executions>
7685
<execution>
7786
<id>attach-sources</id>
@@ -86,15 +95,7 @@
8695
<plugin>
8796
<groupId>org.apache.maven.plugins</groupId>
8897
<artifactId>maven-javadoc-plugin</artifactId>
89-
<version>3.10.1</version>
90-
<configuration>
91-
<source>17</source>
92-
<!-- <aggregate>true</aggregate>-->
93-
<charset>UTF-8</charset>
94-
<encoding>UTF-8</encoding>
95-
<docencoding>UTF-8</docencoding>
96-
<!-- <additionalparam>-Xdoclint:none</additionalparam>-->
97-
</configuration>
98+
<version>${maven-javadoc.version}</version>
9899
<executions>
99100
<execution>
100101
<phase>package</phase>
@@ -110,7 +111,7 @@
110111
<groupId>org.apache.maven.plugins</groupId>
111112
<artifactId>maven-deploy-plugin</artifactId>
112113
<!-- <version>2.8.2</version> -->
113-
<version>3.1.3</version>
114+
<version>${maven-deploy.version}</version>
114115
<executions>
115116
<execution>
116117
<id>default-deploy</id>
@@ -125,7 +126,7 @@
125126
<plugin>
126127
<groupId>org.apache.maven.plugins</groupId>
127128
<artifactId>maven-gpg-plugin</artifactId>
128-
<version>3.2.7</version>
129+
<version>${maven-gpg.version}</version>
129130
<executions>
130131
<execution>
131132
<phase>verify</phase>
@@ -140,7 +141,7 @@
140141
<plugin>
141142
<groupId>org.sonatype.plugins</groupId>
142143
<artifactId>nexus-staging-maven-plugin</artifactId>
143-
<version>1.7.0</version>
144+
<version>${nexus-staging-maven-plugin.version}</version>
144145
<extensions>true</extensions>
145146
<configuration>
146147
<serverId>ossrh</serverId>
@@ -178,14 +179,15 @@
178179
<properties>
179180
<!-- common properties and dependencies -->
180181
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
181-
<maven.compiler.source>17</maven.compiler.source>
182-
<maven.compiler.target>17</maven.compiler.target>
182+
<!-- <maven.compiler.source>21</maven.compiler.source>-->
183+
<!-- <maven.compiler.target>21</maven.compiler.target>-->
184+
<maven.compiler.release>17</maven.compiler.release>
183185
<maven-clean.version>3.4.0</maven-clean.version>
184186
<maven-compiler.version>3.13.0</maven-compiler.version>
185-
<maven-dependency.version>3.8.0</maven-dependency.version>
187+
<maven-dependency.version>3.8.1</maven-dependency.version>
186188
<maven-jar.version>3.4.2</maven-jar.version>
187189
<maven-resources.version>3.3.1</maven-resources.version>
188-
<maven-surefire.version>3.5.1</maven-surefire.version>
190+
<maven-surefire.version>3.5.2</maven-surefire.version>
189191
<maven-install.version>3.1.3</maven-install.version>
190192
<!-- Commons -->
191193
<commons-lang3.version>3.17.0</commons-lang3.version>
@@ -194,7 +196,7 @@
194196
<!-- <commons-text.version>1.11.0</commons-text.version>-->
195197
<!-- <owasp.encoder.version>1.2.3</owasp.encoder.version>-->
196198
<!-- Logging -->
197-
<log4j-api.version>2.24.2</log4j-api.version>
199+
<log4j-api.version>2.24.3</log4j-api.version>
198200
<log4j-disruptor.version>4.0.0</log4j-disruptor.version>
199201
<!-- Mail -->
200202
<jakarta-mail.version>2.0.1</jakarta-mail.version>
@@ -204,14 +206,14 @@
204206
<jwt.version>0.12.6</jwt.version>
205207

206208
<!-- NIO Netty -->
207-
<netty.version>4.1.115.Final</netty.version>
209+
<netty.version>4.1.116.Final</netty.version>
208210
<netty-tcnative.version>2.0.69.Final</netty-tcnative.version>
209211
<!-- gRPC and protobuf -->
210-
<grpc.version>1.68.1</grpc.version>
211-
<guava.version>33.3.1-jre</guava.version>
212-
<protobuf.version>4.28.3</protobuf.version>
212+
<grpc.version>1.69.0</grpc.version>
213+
<guava.version>33.4.0-jre</guava.version>
214+
<protobuf.version>4.29.2</protobuf.version>
213215
<!-- Web JAX-RS -->
214-
<swagger.core.version>2.2.26</swagger.core.version>
216+
<swagger.core.version>2.2.27</swagger.core.version>
215217
<!--<elastic-apm.version>1.36.0</elastic-apm.version>-->
216218

217219

@@ -223,17 +225,17 @@
223225
<reflections.version>0.10.2</reflections.version>
224226

225227
<!-- JSON/XML/Bean Validation -->
226-
<jackson.version>2.18.1</jackson.version>
228+
<jackson.version>2.18.2</jackson.version>
227229
<!-- Bean Validation -->
228230
<jakarta.el.version>6.0.1</jakarta.el.version>
229-
<tomcat-embed-el.version>11.0.1</tomcat-embed-el.version>
230-
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
231+
<tomcat-embed-el.version>11.0.2</tomcat-embed-el.version>
232+
<hibernate-validator.version>8.0.2.Final</hibernate-validator.version>
231233

232234
<!-- IOC Injection -->
233235
<guice.version>7.0.0</guice.version>
234236

235237
<!-- JPA -->
236-
<hibernate.version>6.6.3.Final</hibernate.version>
238+
<hibernate.version>6.6.4.Final</hibernate.version>
237239
<hikari-cp.version>6.2.1</hikari-cp.version>
238240

239241
<!-- Cache -->
@@ -243,7 +245,7 @@
243245
<mqtt.version>1.2.5</mqtt.version>
244246

245247
<!-- Template Engine -->
246-
<freemarker.version>2.3.33</freemarker.version>
248+
<freemarker.version>2.3.34</freemarker.version>
247249
<!-- Barcode -->
248250
<zxing.version>3.5.3</zxing.version>
249251
<!-- PDF - PDFBox
@@ -770,7 +772,7 @@
770772
<groupId>org.testng</groupId>
771773
<artifactId>testng</artifactId>
772774
<version>${testng.version}</version>
773-
<scope>test</scope>
775+
<!-- <scope>test</scope>-->
774776
</dependency>
775777
</dependencies>
776778

src/main/java/org/summerboot/jexpress/boot/BackOffice.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected void loadCustomizedConfigs(File cfgFile, boolean isReal, ConfigUtil he
5858
tpeMax = CPU_CORE + 1;
5959
}
6060

61-
tpe = buildThreadPoolExecutor(tpe, "BackOffice", ThreadingMode.Mixed,
61+
tpe = buildThreadPoolExecutor(tpe, "BackOffice", tpeThreadingMode,
6262
tpeCore, tpeMax, tpeQueue, tpeKeepAliveSeconds, new ThreadPoolExecutor.DiscardPolicy(),
6363
prestartAllCoreThreads, allowCoreThreadTimeOut, false);
6464

@@ -191,6 +191,12 @@ public Map<Integer, Integer> getBootErrorCodeMapping() {
191191
@Config(key = "portinuse.alert.message", defaultValue = ALERT_MSG_PORT_IN_USE)
192192
private String portInUseAlertMessage = ALERT_MSG_PORT_IN_USE;
193193

194+
@Config(key = "backoffice.executor.mode", defaultValue = "VirtualThread",
195+
desc = "valid value = VirtualThread (default for Java 21+), CPU, IO and Mixed (default for old Java) \n use CPU core + 1 when application is CPU bound\n"
196+
+ "use CPU core x 2 + 1 when application is I/O bound\n"
197+
+ "need to find the best value based on your performance test result when nio.server.BizExecutor.mode=Mixed")
198+
protected volatile ThreadingMode tpeThreadingMode = ThreadingMode.VirtualThread;
199+
194200
@Config(key = "backoffice.executor.core", defaultValue = "3",
195201
desc = "0 = current computer/VM's available processors + 1")
196202
private int tpeCore = 3;

src/main/java/org/summerboot/jexpress/boot/BootConstant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface BootConstant {
2727
String APP_ID = String.format("%06d", new Random().nextInt(999999));
2828

2929
//version
30-
String VERSION = "jExpress 2.4.17";
30+
String VERSION = "jExpress 2.4.18";
3131
String JEXPRESS_PACKAGE_NAME = "org.summerboot.jexpress";
3232

3333
String DEFAULT_ADMIN_MM = "changeit";

src/main/java/org/summerboot/jexpress/boot/SummerApplication.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ public void start() {
310310
int port = bindingAddress.getPort();
311311
log.trace("5a. binding gRPC on {}:{}", host, port);
312312
try (var a = Timeout.watch("starting gRPCServer at " + host + ":" + port, timeoutMs).withDesc(timeoutDesc)) {
313-
GRPCServer gRPCServer = new GRPCServer(host, port, gRPCCfg.getKmf(), gRPCCfg.getTmf(), serverInterceptor, gRPCCfg.getTpe(), nioListener);
313+
boolean useVirtualThread = gRPCCfg.getTpeThreadingMode().equals(GRPCServerConfig.ThreadingMode.VirtualThread);
314+
GRPCServer gRPCServer = new GRPCServer(host, port, gRPCCfg.getKmf(), gRPCCfg.getTmf(), serverInterceptor, gRPCCfg.getTpe(), useVirtualThread, nioListener);
314315
ServerBuilder serverBuilder = gRPCServer.getServerBuilder();
315316
for (Class<? extends BindableService> c : gRPCBindableServiceImplClasses) {
316317
BindableService impl = guiceInjector.getInstance(c);

src/main/java/org/summerboot/jexpress/boot/config/BootConfig.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.summerboot.jexpress.boot.config.annotation.Config;
2828
import org.summerboot.jexpress.boot.config.annotation.ConfigHeader;
2929
import org.summerboot.jexpress.boot.config.annotation.ImportResource;
30+
import org.summerboot.jexpress.nio.server.AbortPolicyWithReport;
3031
import org.summerboot.jexpress.security.SecurityUtil;
3132
import org.summerboot.jexpress.util.ApplicationUtil;
3233
import org.summerboot.jexpress.util.BeanUtil;
@@ -59,6 +60,7 @@
5960
import java.util.concurrent.BlockingQueue;
6061
import java.util.concurrent.LinkedBlockingQueue;
6162
import java.util.concurrent.RejectedExecutionHandler;
63+
import java.util.concurrent.ThreadFactory;
6264
import java.util.concurrent.ThreadPoolExecutor;
6365
import java.util.concurrent.TimeUnit;
6466

@@ -588,22 +590,23 @@ protected static int getLength(String s) {
588590
protected static final int CPU_CORE = Runtime.getRuntime().availableProcessors();
589591

590592
public enum ThreadingMode {
591-
CPU, IO, Mixed
593+
VirtualThread, CPU, IO, Mixed
594+
}
595+
596+
public static ThreadPoolExecutor buildThreadPoolExecutor(String tpeName) {
597+
return buildThreadPoolExecutor(null, tpeName, ThreadingMode.VirtualThread, 0, 0, Integer.MAX_VALUE, 60, null, false, true, false);
598+
}
599+
600+
public static ThreadPoolExecutor buildThreadPoolExecutor(String tpeName, ThreadingMode threadingMode, int core, int max, int queue, long keepAliveSec) {
601+
return buildThreadPoolExecutor(null, tpeName, threadingMode, core, max, queue, keepAliveSec, null, false, false, false);
592602
}
593603

594604
public static ThreadPoolExecutor buildThreadPoolExecutor(ThreadPoolExecutor tpe, String tpeName, ThreadingMode threadingMode,
595605
int core, int max, int queue, long keepAliveSec, RejectedExecutionHandler rejectedExecutionHandler,
596606
boolean prestartAllCoreThreads, boolean allowCoreThreadTimeOut, boolean isSingleton) {
607+
boolean useVirtualThread = false;
597608
switch (threadingMode) {
598-
case CPU:// use CPU core + 1 when application is CPU bound
599-
core = CPU_CORE + 1;
600-
max = CPU_CORE + 1;
601-
break;
602-
case IO:// use CPU core x 2 + 1 when application is I/O bound
603-
core = CPU_CORE * 2 + 1;
604-
max = CPU_CORE * 2 + 1;
605-
break;
606-
case Mixed:// manual config is required when it is mixed
609+
case Mixed, VirtualThread -> {// manual config is required when it is mixed
607610
if (core < 1) {
608611
core = CPU_CORE * 2 + 1;
609612
}
@@ -614,7 +617,15 @@ public static ThreadPoolExecutor buildThreadPoolExecutor(ThreadPoolExecutor tpe,
614617
//helper.addError("BizExecutor.MaxSize should not less than BizExecutor.CoreSize");
615618
max = core;
616619
}
617-
break;
620+
}
621+
case CPU -> {// use CPU core + 1 when application is CPU bound
622+
core = CPU_CORE + 1;
623+
max = CPU_CORE + 1;
624+
}
625+
case IO -> {// use CPU core x 2 + 1 when application is I/O bound
626+
core = CPU_CORE * 2 + 1;
627+
max = CPU_CORE * 2 + 1;
628+
}
618629
}
619630

620631
boolean isQueueChanged = false;
@@ -627,9 +638,13 @@ public static ThreadPoolExecutor buildThreadPoolExecutor(ThreadPoolExecutor tpe,
627638
//backup old
628639
ThreadPoolExecutor old = tpe;
629640
//create new
630-
BlockingQueue<Runnable> bq = queue > 0 ? new LinkedBlockingQueue<>(queue) : new EmptyBlockingQueue();
631-
tpe = new ThreadPoolExecutor(core, max, keepAliveSec, TimeUnit.SECONDS, bq,
632-
new NamedDefaultThreadFactory(tpeName), rejectedExecutionHandler);//.DiscardOldestPolicy()
641+
ThreadFactory factory = NamedDefaultThreadFactory.build(tpeName, useVirtualThread);
642+
BlockingQueue<Runnable> workQueue = queue > 0 ? new LinkedBlockingQueue<>(queue) : new EmptyBlockingQueue();
643+
if (rejectedExecutionHandler == null) {
644+
rejectedExecutionHandler = new AbortPolicyWithReport(tpeName);
645+
}
646+
tpe = new ThreadPoolExecutor(core, max, keepAliveSec, TimeUnit.SECONDS, workQueue,
647+
factory, rejectedExecutionHandler);//.DiscardOldestPolicy()
633648
// then shotdown old tpe
634649
if (old != null) {
635650
old.shutdown();

src/main/java/org/summerboot/jexpress/boot/config/NamedDefaultThreadFactory.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,17 @@ public class NamedDefaultThreadFactory implements ThreadFactory {
77

88
protected static final AtomicInteger poolNumber = new AtomicInteger(1);
99
protected final ThreadGroup group;
10-
protected final AtomicInteger threadNumber = new AtomicInteger(1);
10+
protected final AtomicInteger threadCounter = new AtomicInteger(1);
1111
protected final String namePrefix;
1212

13-
public NamedDefaultThreadFactory(String name) {
13+
private NamedDefaultThreadFactory(String tpeName) {
1414
group = Thread.currentThread().getThreadGroup();
15-
namePrefix = name + "-"
16-
+ poolNumber.getAndIncrement()
17-
+ "-thread-";
15+
namePrefix = tpeName;
1816
}
1917

2018
@Override
2119
public Thread newThread(Runnable r) {
22-
Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
20+
Thread t = new Thread(group, r, namePrefix + threadCounter.getAndIncrement(), 0);
2321
if (t.isDaemon()) {
2422
t.setDaemon(false);
2523
}
@@ -28,4 +26,11 @@ public Thread newThread(Runnable r) {
2826
}
2927
return t;
3028
}
29+
30+
public static ThreadFactory build(String tpeName, boolean useVirtualThread) {
31+
String namePrefix = tpeName + "-"
32+
+ poolNumber.getAndIncrement()
33+
+ (useVirtualThread ? "-vt-" : "-pt-");
34+
return new NamedDefaultThreadFactory(namePrefix);
35+
}
3136
}

src/main/java/org/summerboot/jexpress/boot/instrumentation/jmx/ServerStatus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class ServerStatus extends NotificationBroadcasterSupport implements NIOS
4545

4646
protected static final DateTimeFormatter DTF = DateTimeFormatter.ISO_LOCAL_DATE_TIME;//DateTimeFormatter.ofPattern("yyyy-MM-dd E HH:mm:ss");
4747

48-
protected static final ExecutorService QPS_SERVICE = Executors.newSingleThreadExecutor(new NamedDefaultThreadFactory("ServerStatus"));
48+
protected static final ExecutorService QPS_SERVICE = Executors.newSingleThreadExecutor(NamedDefaultThreadFactory.build("ServerStatus", true));
4949

5050
protected final LinkedList<BootIOStatusData> events;
5151

src/main/java/org/summerboot/jexpress/integration/cache/BootCache_RedisImple.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@
1919
import com.google.inject.Singleton;
2020
import org.apache.logging.log4j.LogManager;
2121
import org.apache.logging.log4j.Logger;
22-
import org.summerboot.jexpress.boot.config.NamedDefaultThreadFactory;
22+
import org.summerboot.jexpress.boot.config.BootConfig;
2323
import org.summerboot.jexpress.integration.cache.domain.FlashSale;
2424
import org.summerboot.jexpress.integration.smtp.PostOffice;
2525
import org.summerboot.jexpress.integration.smtp.SMTPClientConfig;
26-
import org.summerboot.jexpress.nio.server.AbortPolicyWithReport;
2726
import redis.clients.jedis.Jedis;
2827
import redis.clients.jedis.Pipeline;
2928
import redis.clients.jedis.Response;
@@ -36,7 +35,6 @@
3635
import java.util.HashMap;
3736
import java.util.List;
3837
import java.util.Map;
39-
import java.util.concurrent.LinkedBlockingQueue;
4038
import java.util.concurrent.RejectedExecutionException;
4139
import java.util.concurrent.ThreadPoolExecutor;
4240
import java.util.concurrent.TimeUnit;
@@ -86,7 +84,9 @@ public class BootCache_RedisImple implements AuthTokenCache, BootCache {
8684

8785
protected static final Logger log = LogManager.getLogger(BootCache_RedisImple.class.getName());
8886

89-
protected static final ThreadPoolExecutor tpe = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1), new NamedDefaultThreadFactory("Redis"), new AbortPolicyWithReport("Cahce.BackofficeExecutor"));
87+
protected static final ThreadPoolExecutor tpe = BootConfig.buildThreadPoolExecutor(null, "Redis", BootConfig.ThreadingMode.VirtualThread,
88+
1, 1, 1, 60, null,
89+
false, false, false);
9090

9191
protected static final RuntimeException REDIS_MASTER_NULL_EX = new RuntimeException("Redis master is null");
9292

0 commit comments

Comments
 (0)