Configuration options for virtual threads (on JDK 21)

VirtualThreadDelegate built on JDK 21 for multi-release jar.
Includes dedicated VirtualThreadTaskExecutor as lean option.
Includes setVirtualThreads flag on SimpleAsyncTaskExecutor.
Includes additional default methods on AsyncTaskExecutor.

Closes gh-30241
This commit is contained in:
Juergen Hoeller
2023-05-08 11:22:47 +02:00
parent d8d7e0a762
commit 697d5e6247
16 changed files with 385 additions and 64 deletions

View File

@@ -214,7 +214,7 @@ class ClassPathResourceTests {
@Test
void directoryNotReadable() throws Exception {
Resource fileDir = new ClassPathResource("org/springframework/core");
Resource fileDir = new ClassPathResource("example/type");
assertThat(fileDir.getURL()).asString().startsWith("file:");
assertThat(fileDir.exists()).isTrue();
assertThat(fileDir.isReadable()).isFalse();

View File

@@ -68,8 +68,8 @@ class ResourceTests {
@ParameterizedTest(name = "{index}: {0}")
@MethodSource("resource")
void resourceIsValid(Resource resource) throws Exception {
assertThat(resource.getFilename()).isEqualTo("Resource.class");
assertThat(resource.getURL().getFile()).endsWith("Resource.class");
assertThat(resource.getFilename()).isEqualTo("ResourceTests.class");
assertThat(resource.getURL().getFile()).endsWith("ResourceTests.class");
assertThat(resource.exists()).isTrue();
assertThat(resource.isReadable()).isTrue();
assertThat(resource.contentLength()).isGreaterThan(0);
@@ -80,9 +80,9 @@ class ResourceTests {
@ParameterizedTest(name = "{index}: {0}")
@MethodSource("resource")
void resourceCreateRelative(Resource resource) throws Exception {
Resource relative1 = resource.createRelative("ClassPathResource.class");
assertThat(relative1.getFilename()).isEqualTo("ClassPathResource.class");
assertThat(relative1.getURL().getFile().endsWith("ClassPathResource.class")).isTrue();
Resource relative1 = resource.createRelative("ClassPathResourceTests.class");
assertThat(relative1.getFilename()).isEqualTo("ClassPathResourceTests.class");
assertThat(relative1.getURL().getFile().endsWith("ClassPathResourceTests.class")).isTrue();
assertThat(relative1.exists()).isTrue();
assertThat(relative1.isReadable()).isTrue();
assertThat(relative1.contentLength()).isGreaterThan(0);
@@ -92,9 +92,9 @@ class ResourceTests {
@ParameterizedTest(name = "{index}: {0}")
@MethodSource("resource")
void resourceCreateRelativeWithFolder(Resource resource) throws Exception {
Resource relative2 = resource.createRelative("support/ResourcePatternResolver.class");
assertThat(relative2.getFilename()).isEqualTo("ResourcePatternResolver.class");
assertThat(relative2.getURL().getFile()).endsWith("ResourcePatternResolver.class");
Resource relative2 = resource.createRelative("support/PathMatchingResourcePatternResolverTests.class");
assertThat(relative2.getFilename()).isEqualTo("PathMatchingResourcePatternResolverTests.class");
assertThat(relative2.getURL().getFile()).endsWith("PathMatchingResourcePatternResolverTests.class");
assertThat(relative2.exists()).isTrue();
assertThat(relative2.isReadable()).isTrue();
assertThat(relative2.contentLength()).isGreaterThan(0);
@@ -104,9 +104,9 @@ class ResourceTests {
@ParameterizedTest(name = "{index}: {0}")
@MethodSource("resource")
void resourceCreateRelativeWithDotPath(Resource resource) throws Exception {
Resource relative3 = resource.createRelative("../SpringVersion.class");
assertThat(relative3.getFilename()).isEqualTo("SpringVersion.class");
assertThat(relative3.getURL().getFile()).endsWith("SpringVersion.class");
Resource relative3 = resource.createRelative("../CollectionFactoryTests.class");
assertThat(relative3.getFilename()).isEqualTo("CollectionFactoryTests.class");
assertThat(relative3.getURL().getFile()).endsWith("CollectionFactoryTests.class");
assertThat(relative3.exists()).isTrue();
assertThat(relative3.isReadable()).isTrue();
assertThat(relative3.contentLength()).isGreaterThan(0);
@@ -128,12 +128,12 @@ class ResourceTests {
}
private static Stream<Arguments> resource() throws URISyntaxException {
URL resourceClass = ResourceTests.class.getResource("Resource.class");
URL resourceClass = ResourceTests.class.getResource("ResourceTests.class");
Path resourceClassFilePath = Paths.get(resourceClass.toURI());
return Stream.of(
arguments(named("ClassPathResource", new ClassPathResource("org/springframework/core/io/Resource.class"))),
arguments(named("ClassPathResource with ClassLoader", new ClassPathResource("org/springframework/core/io/Resource.class", ResourceTests.class.getClassLoader()))),
arguments(named("ClassPathResource with Class", new ClassPathResource("Resource.class", ResourceTests.class))),
arguments(named("ClassPathResource", new ClassPathResource("org/springframework/core/io/ResourceTests.class"))),
arguments(named("ClassPathResource with ClassLoader", new ClassPathResource("org/springframework/core/io/ResourceTests.class", ResourceTests.class.getClassLoader()))),
arguments(named("ClassPathResource with Class", new ClassPathResource("ResourceTests.class", ResourceTests.class))),
arguments(named("FileSystemResource", new FileSystemResource(resourceClass.getFile()))),
arguments(named("FileSystemResource with File", new FileSystemResource(new File(resourceClass.getFile())))),
arguments(named("FileSystemResource with File path", new FileSystemResource(resourceClassFilePath))),
@@ -220,29 +220,29 @@ class ResourceTests {
@Test
void sameResourceIsEqual() {
String file = getClass().getResource("Resource.class").getFile();
String file = getClass().getResource("ResourceTests.class").getFile();
Resource resource = new FileSystemResource(file);
assertThat(resource).isEqualTo(new FileSystemResource(file));
}
@Test
void sameResourceFromFileIsEqual() {
File file = new File(getClass().getResource("Resource.class").getFile());
File file = new File(getClass().getResource("ResourceTests.class").getFile());
Resource resource = new FileSystemResource(file);
assertThat(resource).isEqualTo(new FileSystemResource(file));
}
@Test
void sameResourceFromFilePathIsEqual() throws Exception {
Path filePath = Paths.get(getClass().getResource("Resource.class").toURI());
Path filePath = Paths.get(getClass().getResource("ResourceTests.class").toURI());
Resource resource = new FileSystemResource(filePath);
assertThat(resource).isEqualTo(new FileSystemResource(filePath));
}
@Test
void sameResourceFromDotPathIsEqual() {
Resource resource = new FileSystemResource("core/io/Resource.class");
assertThat(new FileSystemResource("core/../core/io/./Resource.class")).isEqualTo(resource);
Resource resource = new FileSystemResource("core/io/ResourceTests.class");
assertThat(new FileSystemResource("core/../core/io/./ResourceTests.class")).isEqualTo(resource);
}
@Test
@@ -254,7 +254,7 @@ class ResourceTests {
@Test
void readableChannelProvidesContent() throws Exception {
Resource resource = new FileSystemResource(getClass().getResource("Resource.class").getFile());
Resource resource = new FileSystemResource(getClass().getResource("ResourceTests.class").getFile());
try (ReadableByteChannel channel = resource.readableChannel()) {
ByteBuffer buffer = ByteBuffer.allocate((int) resource.contentLength());
channel.read(buffer);
@@ -293,8 +293,8 @@ class ResourceTests {
@Test
void sameResourceWithRelativePathIsEqual() throws Exception {
Resource resource = new UrlResource("file:core/io/Resource.class");
assertThat(new UrlResource("file:core/../core/io/./Resource.class")).isEqualTo(resource);
Resource resource = new UrlResource("file:core/io/ResourceTests.class");
assertThat(new UrlResource("file:core/../core/io/./ResourceTests.class")).isEqualTo(resource);
}
@Test
@@ -322,14 +322,14 @@ class ResourceTests {
@Test
void factoryMethodsProduceEqualResources() throws Exception {
Resource resource1 = new UrlResource("file:core/io/Resource.class");
Resource resource2 = UrlResource.from("file:core/io/Resource.class");
Resource resource1 = new UrlResource("file:core/io/ResourceTests.class");
Resource resource2 = UrlResource.from("file:core/io/ResourceTests.class");
Resource resource3 = UrlResource.from(resource1.getURI());
assertThat(resource2.getURL()).isEqualTo(resource1.getURL());
assertThat(resource3.getURL()).isEqualTo(resource1.getURL());
assertThat(UrlResource.from("file:core/../core/io/./Resource.class")).isEqualTo(resource1);
assertThat(UrlResource.from("file:core/../core/io/./ResourceTests.class")).isEqualTo(resource1);
assertThat(UrlResource.from("file:/dir/test.txt?argh").getFilename()).isEqualTo("test.txt");
assertThat(UrlResource.from("file:\\dir\\test.txt?argh").getFilename()).isEqualTo("test.txt");
assertThat(UrlResource.from("file:\\dir/test.txt?argh").getFilename()).isEqualTo("test.txt");
@@ -433,7 +433,6 @@ class ResourceTests {
public String getDescription() {
return name;
}
@Override
public InputStream getInputStream() throws IOException {
throw new FileNotFoundException();
@@ -459,7 +458,6 @@ class ResourceTests {
public InputStream getInputStream() {
return new ByteArrayInputStream(new byte[] {'a', 'b', 'c'});
}
@Override
public String getDescription() {
return "";