// Configuring Eclipse Jetty to use Virtual Threads
A quick guide about how to configure Jetty to use Project Loom's virtual threads instead of plain old java threads.
Jetty's default thread pool implementation can be swapped out by implementing Jetty's ThreadPool
interface and passing an instance to the Server
constructor. If you are using jetty stand alone, everything is initialized by xml files.
Assuming you are using the recommended jetty home / jetty base folder structure, all what is needed is to create jetty-threadpool.xml
in [jetty-base]/etc
containing the following:
<Configure>
<New id="threadPool" class="dev.mbien.virtualthreads4jetty.VirtualThreadExecutor"/>
</Configure>
and put a jar containing the custom VirtualThreadExecutor
into [jetty-base]/lib/ext
.
I uploaded a build to the release section of the vt4jetty github project.
If you don't have an lib/ext folder yet you can enable it with:
java -jar $JETTY_HOME/start.jar --add-to-start=ext
here the code:
package dev.mbien.virtualthreads4jetty;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.util.thread.ThreadPool;
/**
* Executes each task in a new virtual thread.
*
* <p>Java's default ForkJoinPool is used as scheduler. To influence carrier
* thread count use -Djdk.defaultScheduler.parallelism=N. Default is
* {@link Runtime#availableProcessors()}.
*
* @author mbien
*/
public class VirtualThreadExecutor implements ThreadPool {
private final ExecutorService executor;
public VirtualThreadExecutor() {
executor = Executors.newThreadExecutor(
Thread.builder().virtual().name("jetty-vt#", 0).factory());
// too early for logging libs
System.out.println("VirtualThreadExecutor is active.");
}
@Override
public void execute(Runnable command) {
executor.execute(command);
}
@Override
public void join() throws InterruptedException {
executor.shutdown();
executor.awaitTermination(3, TimeUnit.SECONDS);
}
// those are hopefully only used for stats/dashboards etc
@Override
public int getThreads() { return -1; }
@Override
public int getIdleThreads() { return -1; }
@Override
public boolean isLowOnThreads() { return false; }
}
Tested with JDK16-loom+4-56 (2020/7/25) early access build from here and latest Jetty.
I encountered some JVM crashes while load testing Apache Roller with virtual threads enabled - keep in mind this is still all very much work in progress.