Skip to content

Commit 126a2c5

Browse files
committed
New round of spring-webflux optimizations
- Upgrade to Spring Boot 3.3.4 - Disable Netty leak detection - Turn a flapMap operation to a map - Switch to jstachio for view rendering - Remove unused JdbcDbRepository class - Polishing
1 parent 67ea66c commit 126a2c5

File tree

13 files changed

+58
-109
lines changed

13 files changed

+58
-109
lines changed

frameworks/Java/spring-webflux/pom.xml

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@
1313
<parent>
1414
<groupId>org.springframework.boot</groupId>
1515
<artifactId>spring-boot-starter-parent</artifactId>
16-
<version>3.3.3</version>
16+
<version>3.3.4</version>
1717
</parent>
1818

1919
<properties>
20-
<maven.compiler.source>21</maven.compiler.source>
21-
<maven.compiler.target>21</maven.compiler.target>
22-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20+
<java.version>21</java.version>
21+
<jstachio.version>1.3.6</jstachio.version>
2322
</properties>
2423

2524
<dependencies>
@@ -36,8 +35,16 @@
3635
<artifactId>r2dbc-postgresql</artifactId>
3736
</dependency>
3837
<dependency>
39-
<groupId>org.springframework.boot</groupId>
40-
<artifactId>spring-boot-starter-mustache</artifactId>
38+
<groupId>io.jstach</groupId>
39+
<artifactId>jstachio</artifactId>
40+
<version>${jstachio.version}</version>
41+
</dependency>
42+
<dependency>
43+
<groupId>io.jstach</groupId>
44+
<artifactId>jstachio-apt</artifactId>
45+
<version>${jstachio.version}</version>
46+
<scope>provided</scope>
47+
<optional>true</optional>
4148
</dependency>
4249
<dependency>
4350
<groupId>org.springframework.boot</groupId>
@@ -55,6 +62,15 @@
5562
<plugin>
5663
<groupId>org.apache.maven.plugins</groupId>
5764
<artifactId>maven-compiler-plugin</artifactId>
65+
<configuration>
66+
<annotationProcessorPaths>
67+
<path>
68+
<groupId>io.jstach</groupId>
69+
<artifactId>jstachio-apt</artifactId>
70+
<version>${jstachio.version}</version>
71+
</path>
72+
</annotationProcessorPaths>
73+
</configuration>
5874
</plugin>
5975
</plugins>
6076
</build>

frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ RUN java -Djarmode=tools -jar app.jar extract
1313

1414
EXPOSE 8080
1515

16-
CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=mongo"]
16+
CMD ["java", "-Dlogging.level.root=OFF", "-Dio.netty.leakDetection.level=disabled", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=mongo"]

frameworks/Java/spring-webflux/spring-webflux.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ RUN java -Djarmode=tools -jar app.jar extract
1212

1313
EXPOSE 8080
1414

15-
CMD ["java", "-Dlogging.level.root=OFF", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=r2dbc"]
15+
CMD ["java", "-Dlogging.level.root=OFF", "-Dio.netty.leakDetection.level=disabled", "-Dreactor.netty.http.server.lastFlushWhenNoRead=true", "-jar", "app/app.jar", "--spring.profiles.active=r2dbc"]

frameworks/Java/spring-webflux/src/main/java/benchmark/App.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.springframework.web.reactive.function.server.RouterFunction;
1212
import org.springframework.web.reactive.function.server.RouterFunctions;
1313
import org.springframework.web.reactive.function.server.ServerResponse;
14-
import org.springframework.web.reactive.result.view.ViewResolver;
1514
import org.springframework.web.server.WebHandler;
1615
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
1716

@@ -20,8 +19,8 @@
2019
public class App {
2120

2221
@Bean
23-
public HttpHandler httpHandler(RouterFunction<ServerResponse> route, ServerFilter serverFilter, ViewResolver viewResolver) {
24-
WebHandler webHandler = RouterFunctions.toWebHandler(route, HandlerStrategies.builder().viewResolver(viewResolver).build());
22+
public HttpHandler httpHandler(RouterFunction<ServerResponse> route, ServerFilter serverFilter) {
23+
WebHandler webHandler = RouterFunctions.toWebHandler(route, HandlerStrategies.builder().build());
2524
return WebHttpHandlerBuilder.webHandler(webHandler).filter(serverFilter).build();
2625
}
2726

frameworks/Java/spring-webflux/src/main/java/benchmark/model/Fortune.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@
44
import org.springframework.data.mongodb.core.mapping.Document;
55

66
@Document
7-
public final class Fortune {
7+
public final class Fortune implements Comparable<Fortune> {
8+
89
@Id
910
public int id;
11+
1012
public String message;
1113

1214
public Fortune(int id, String message) {
1315
this.id = id;
1416
this.message = message;
1517
}
1618

17-
public int getId() {
18-
return id;
19-
}
20-
21-
public String getMessage() {
22-
return message;
19+
@Override
20+
public int compareTo(final Fortune other) {
21+
return message.compareTo(other.message);
2322
}
2423
}

frameworks/Java/spring-webflux/src/main/java/benchmark/model/Message.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

frameworks/Java/spring-webflux/src/main/java/benchmark/model/World.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public final class World {
99

1010
@Id
1111
public int id;
12+
1213
@Field("randomNumber")
1314
public int randomnumber;
1415

frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import reactor.core.publisher.Mono;
77

88
public interface DbRepository {
9+
910
Mono<World> getWorld(int id);
1011

1112
Mono<World> findAndUpdateWorld(int id, int randomNumber);

frameworks/Java/spring-webflux/src/main/java/benchmark/repository/JdbcDbRepository.java

Lines changed: 0 additions & 63 deletions
This file was deleted.

frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
import benchmark.model.Fortune;
88
import benchmark.model.World;
99
import benchmark.repository.DbRepository;
10+
import io.jstach.jstachio.JStachio;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

1314
import org.springframework.core.ParameterizedTypeReference;
15+
import org.springframework.http.HttpHeaders;
1416
import org.springframework.http.MediaType;
1517
import org.springframework.stereotype.Component;
1618
import org.springframework.web.reactive.function.server.ServerRequest;
1719
import org.springframework.web.reactive.function.server.ServerResponse;
1820

19-
import static java.util.Comparator.comparing;
20-
2121
@Component
2222
public class DbHandler {
2323

@@ -33,7 +33,7 @@ public Mono<ServerResponse> db(ServerRequest request) {
3333
.switchIfEmpty(Mono.error(new Exception("No World found with Id: " + id)));
3434

3535
return ServerResponse.ok()
36-
.contentType(MediaType.APPLICATION_JSON)
36+
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
3737
.body(world, World.class);
3838
}
3939

@@ -45,7 +45,7 @@ public Mono<ServerResponse> queries(ServerRequest request) {
4545
.collectList();
4646

4747
return ServerResponse.ok()
48-
.contentType(MediaType.APPLICATION_JSON)
48+
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
4949
.body(worlds, new ParameterizedTypeReference<List<World>>() {
5050
});
5151
}
@@ -71,20 +71,21 @@ public Mono<ServerResponse> updates(ServerRequest request) {
7171
.collectList();
7272

7373
return ServerResponse.ok()
74-
.contentType(MediaType.APPLICATION_JSON)
74+
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
7575
.body(worlds, new ParameterizedTypeReference<List<World>>() {
7676
});
7777
}
7878

7979
public Mono<ServerResponse> fortunes(ServerRequest request) {
80-
Mono<List<Fortune>> result = dbRepository.fortunes().collectList().flatMap(fortunes -> {
81-
fortunes.add(new Fortune(0, "Additional fortune added at request time."));
82-
fortunes.sort(comparing(fortune -> fortune.message));
83-
return Mono.just(fortunes);
80+
return Mono.just(new Fortune(0, "Additional fortune added at request time."))
81+
.concatWith(dbRepository.fortunes())
82+
.collectList()
83+
.flatMap(fortunes -> {
84+
Collections.sort(fortunes);
85+
return ServerResponse.ok()
86+
.header(HttpHeaders.CONTENT_TYPE, "text/html; charset=utf-8")
87+
.bodyValue(JStachio.render(new Fortunes(fortunes)));
8488
});
85-
86-
return ServerResponse.ok()
87-
.render("fortunes", Collections.singletonMap("fortunes", result));
8889
}
8990

9091
private static int randomWorldNumber() {

0 commit comments

Comments
 (0)