Skip to content

Commit

Permalink
Micronaut: Use JTE template engine and GraalVM 22 (TechEmpower#9262)
Browse files Browse the repository at this point in the history
* Micronaut: Use JTE template engine and GraalVM 22

* CR

* User Graalvm 21 for Micronaut Data
  • Loading branch information
dstepanov authored Sep 12, 2024
1 parent 64398bc commit 1d0f0af
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ dependencies {
}

graalvmNative.binaries.all {
buildArgs.add("--initialize-at-build-time=views")
buildArgs.add("--initialize-at-build-time=gg.jte.generated.precompiled")
}

test {
Expand Down
24 changes: 14 additions & 10 deletions frameworks/Java/micronaut/common/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'java'
id "io.micronaut.library"
id "nu.studer.rocker" version "3.0.4"
id "gg.jte.gradle" version "3.1.12"
}

group 'io.micronaut.benchmark'
Expand All @@ -16,14 +16,10 @@ micronaut {
testRuntime "junit5"
}

rocker {
configurations {
main {
templateDir = file('src/main/resources')
outputDir = file('build/generated/rocker')
optimize = true
}
}
jte {
sourceDirectory = file("src/main/jte").toPath()
generate()
binaryStaticContent = true
}

dependencies {
Expand All @@ -38,12 +34,20 @@ dependencies {
transitive = false
}

implementation("com.fizzed:rocker-runtime")
// Switch to BOM version after https://github.com/micronaut-projects/micronaut-views/issues/876
implementation("gg.jte:jte-runtime:3.1.12")

runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("org.yaml:snakeyaml")
}

test {
useJUnitPlatform()
}

// Gradle requires that generateJte is run before some tasks
tasks.configureEach {
if (name == "inspectRuntimeClasspath") {
mustRunAfter("generateJte")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,28 @@

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

public class AbstractBenchmarkController {

protected final Integer[] boxed = IntStream.range(1, 10001).boxed().toArray(Integer[]::new);
private static final Comparator<Fortune> FORTUNES_COMPARATOR = new Comparator<>() {
@Override
public int compare(Fortune o1, Fortune o2) {
return o1.message().compareTo(o2.message());
}
};

protected List<Fortune> prepareFortunes(List<Fortune> fortuneList) {
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
all.add(new Fortune(0, "Additional fortune added at request time."));
all.addAll(fortuneList);
all.sort(FORTUNES_COMPARATOR);
return all;
}

protected List<Fortune> createFortunes() {
List<Integer> fortuneMessages = IntStream.range(0, 10).boxed().toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
import benchmark.repository.AsyncFortuneRepository;
import benchmark.repository.AsyncWorldRepository;
import io.micronaut.context.annotation.Requires;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.QueryValue;
import views.fortunes;

import java.util.ArrayList;
import java.util.Comparator;
Expand Down Expand Up @@ -55,15 +53,8 @@ public CompletionStage<List<World>> queries(@QueryValue String queries) {

// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
public CompletionStage<HttpResponse<String>> fortune() {
return fortuneRepository.findAll().thenApply(fortuneList -> {
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
all.add(new Fortune(0, "Additional fortune added at request time."));
all.addAll(fortuneList);
all.sort(comparing(Fortune::message));
String body = fortunes.template(all).render().toString();
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
});
public CompletionStage<List<Fortune>> fortune() {
return fortuneRepository.findAll().thenApply(this::prepareFortunes);
}

// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,14 @@
import benchmark.repository.FortuneRepository;
import benchmark.repository.WorldRepository;
import io.micronaut.context.annotation.Requires;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.QueryValue;
import views.fortunes;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

import static java.util.Comparator.comparing;

@Requires(beans = {WorldRepository.class, FortuneRepository.class})
@Controller
public class BenchmarkController extends AbstractBenchmarkController {
Expand Down Expand Up @@ -56,14 +51,8 @@ public List<World> queries(@QueryValue String queries) {

// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
public HttpResponse<String> fortune() {
Collection<Fortune> all = fortuneRepository.findAll();
List<Fortune> fortunesList = new ArrayList<>(all.size() + 1);
fortunesList.add(new Fortune(0, "Additional fortune added at request time."));
fortunesList.addAll(all);
fortunesList.sort(comparing(Fortune::message));
String body = fortunes.template(fortunesList).render().toString();
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
public List<Fortune> fortune() {
return prepareFortunes(fortuneRepository.findAll());
}

// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
Expand All @@ -77,5 +66,5 @@ public List<World> updates(@QueryValue String queries) {
worldRepository.updateAll(worldList);
return worldList;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package benchmark.controller;

import benchmark.model.Fortune;
import gg.jte.TemplateOutput;
import gg.jte.generated.precompiled.JtefortunesGenerated;
import gg.jte.html.OwaspHtmlTemplateOutput;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.type.Argument;
import io.micronaut.core.type.MutableHeaders;
import io.micronaut.http.MediaType;
import io.micronaut.http.body.MessageBodyWriter;
import io.micronaut.http.codec.CodecException;
import io.micronaut.http.netty.NettyHttpHeaders;
import jakarta.inject.Singleton;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Singleton
public class FortunesBodyWriter implements MessageBodyWriter<List<Fortune>> {

@Override
public void writeTo(@NonNull Argument<List<Fortune>> type,
@NonNull MediaType mediaType,
List<Fortune> values,
@NonNull MutableHeaders outgoingHeaders,
@NonNull OutputStream outputStream) throws CodecException {
outgoingHeaders.set(NettyHttpHeaders.CONTENT_TYPE, "text/html;charset=utf-8");
TemplateOutput output = new TemplateOutput() {

@Override
public void writeContent(String value) {
writeBinaryContent(value.getBytes(StandardCharsets.UTF_8));
}

@Override
public void writeContent(String value, int beginIndex, int endIndex) {
writeBinaryContent(value.substring(beginIndex, endIndex).getBytes(StandardCharsets.UTF_8));
}

@Override
public void writeBinaryContent(byte[] value) {
try {
outputStream.write(value);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
};
JtefortunesGenerated.render(new OwaspHtmlTemplateOutput(output), null, values);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,17 @@
import benchmark.repository.ReactiveWorldRepository;
import io.micronaut.context.annotation.Requires;
import io.micronaut.core.async.annotation.SingleResult;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.QueryValue;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import views.fortunes;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import static java.util.Comparator.comparing;

@Requires(beans = {ReactiveWorldRepository.class, ReactiveFortuneRepository.class})
@Controller
public class ReactiveBenchmarkController extends AbstractBenchmarkController {
Expand Down Expand Up @@ -61,15 +57,8 @@ public Publisher<List<World>> queries(@QueryValue String queries) {
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
@SingleResult
public Mono<HttpResponse<String>> fortune() {
return Mono.from(fortuneRepository.findAll()).map(fortuneList -> {
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
all.add(new Fortune(0, "Additional fortune added at request time."));
all.addAll(fortuneList);
all.sort(comparing(Fortune::message));
String body = fortunes.template(all).render().toString();
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
});
public Mono<List<Fortune>> fortune() {
return Mono.from(fortuneRepository.findAll()).map(this::prepareFortunes);
}

// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import org.reactivestreams.Publisher;

import java.util.Collection;
import java.util.List;

public interface FortuneRepository {

void initDb(Collection<Fortune> fortunes);

Collection<Fortune> findAll();
List<Fortune> findAll();

}
4 changes: 4 additions & 0 deletions frameworks/Java/micronaut/common/src/main/jte/fortunes.jte
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@param java.util.List<benchmark.model.Fortune> fortunes
<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>@for(benchmark.model.Fortune fortune : fortunes)
<tr><td>${fortune.id()}</td><td>${fortune.message()}</td></tr>@endfor
</table></body></html>

This file was deleted.

2 changes: 1 addition & 1 deletion frameworks/Java/micronaut/gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
micronautVersion=4.6.0
micronautVersion=4.6.1
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import benchmark.model.World;
import benchmark.repository.WorldRepository;
import io.micronaut.data.connection.annotation.Connectable;
import io.micronaut.data.jdbc.annotation.JdbcRepository;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.repository.GenericRepository;
Expand All @@ -20,6 +21,7 @@ default void initDb(Collection<World> worlds) {

void saveAll(Collection<World> worlds);

@Connectable
@Override
default List<World> findByIds(List<Integer> ids) {
return WorldRepository.super.findByIds(ids);
Expand Down
2 changes: 1 addition & 1 deletion frameworks/Java/micronaut/micronaut-graalvm.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM container-registry.oracle.com/graalvm/native-image:21
FROM container-registry.oracle.com/graalvm/native-image:22
RUN microdnf install findutils # Gradle 8.7 requires xargs
COPY . /home/gradle/src
WORKDIR /home/gradle/src
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM container-registry.oracle.com/graalvm/native-image:21
FROM container-registry.oracle.com/graalvm/native-image:22
RUN microdnf install findutils # Gradle 8.7 requires xargs
COPY . /home/gradle/src
WORKDIR /home/gradle/src
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void initDb(Collection<Fortune> fortunes) {
}

@Override
public Collection<Fortune> findAll() {
public List<Fortune> findAll() {
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement("SELECT id, message FROM fortune",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM container-registry.oracle.com/graalvm/native-image:21
FROM container-registry.oracle.com/graalvm/native-image:22
RUN microdnf install findutils # Gradle 8.7 requires xargs
COPY . /home/gradle/src
WORKDIR /home/gradle/src
Expand Down

0 comments on commit 1d0f0af

Please sign in to comment.