Skip to content

Commit cd83c1a

Browse files
committed
Merge pull request #39958 from MazizEsa
* pr/39958: Polish "Set virtual thread names for RabbitMQ and Pulsar" Set virtual thread names for RabbitMQ and Pulsar Closes gh-39958
2 parents f1ccc94 + 09652cb commit cd83c1a

File tree

4 files changed

+40
-7
lines changed

4 files changed

+40
-7
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ SimpleRabbitListenerContainerFactoryConfigurer simpleRabbitListenerContainerFact
7676
@ConditionalOnThreading(Threading.VIRTUAL)
7777
SimpleRabbitListenerContainerFactoryConfigurer simpleRabbitListenerContainerFactoryConfigurerVirtualThreads() {
7878
SimpleRabbitListenerContainerFactoryConfigurer configurer = simpleListenerConfigurer();
79-
configurer.setTaskExecutor(new VirtualThreadTaskExecutor());
79+
configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-simple-"));
8080
return configurer;
8181
}
8282

@@ -105,7 +105,7 @@ DirectRabbitListenerContainerFactoryConfigurer directRabbitListenerContainerFact
105105
@ConditionalOnThreading(Threading.VIRTUAL)
106106
DirectRabbitListenerContainerFactoryConfigurer directRabbitListenerContainerFactoryConfigurerVirtualThreads() {
107107
DirectRabbitListenerContainerFactoryConfigurer configurer = directListenerConfigurer();
108-
configurer.setTaskExecutor(new VirtualThreadTaskExecutor());
108+
configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-direct-"));
109109
return configurer;
110110
}
111111

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/pulsar/PulsarAutoConfiguration.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@
7373
@Import(PulsarConfiguration.class)
7474
public class PulsarAutoConfiguration {
7575

76-
private PulsarProperties properties;
76+
private final PulsarProperties properties;
7777

78-
private PulsarPropertiesMapper propertiesMapper;
78+
private final PulsarPropertiesMapper propertiesMapper;
7979

8080
PulsarAutoConfiguration(PulsarProperties properties) {
8181
this.properties = properties;
@@ -158,7 +158,7 @@ ConcurrentPulsarListenerContainerFactory<?> pulsarListenerContainerFactory(
158158
containerProperties.setSchemaResolver(schemaResolver);
159159
containerProperties.setTopicResolver(topicResolver);
160160
if (Threading.VIRTUAL.isActive(environment)) {
161-
containerProperties.setConsumerTaskExecutor(new VirtualThreadTaskExecutor());
161+
containerProperties.setConsumerTaskExecutor(new VirtualThreadTaskExecutor("pulsar-consumer-"));
162162
}
163163
this.propertiesMapper.customizeContainerProperties(containerProperties);
164164
return new ConcurrentPulsarListenerContainerFactory<>(pulsarConsumerFactory, containerProperties);
@@ -189,7 +189,7 @@ DefaultPulsarReaderContainerFactory<?> pulsarReaderContainerFactory(PulsarReader
189189
PulsarReaderContainerProperties readerContainerProperties = new PulsarReaderContainerProperties();
190190
readerContainerProperties.setSchemaResolver(schemaResolver);
191191
if (Threading.VIRTUAL.isActive(environment)) {
192-
readerContainerProperties.setReaderTaskExecutor(new VirtualThreadTaskExecutor());
192+
readerContainerProperties.setReaderTaskExecutor(new VirtualThreadTaskExecutor("pulsar-reader-"));
193193
}
194194
this.propertiesMapper.customizeReaderContainerProperties(readerContainerProperties);
195195
return new DefaultPulsarReaderContainerFactory<>(pulsarReaderFactory, readerContainerProperties);

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java

+24-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.security.NoSuchAlgorithmException;
2020
import java.util.List;
21+
import java.util.concurrent.ThreadFactory;
2122
import java.util.concurrent.atomic.AtomicInteger;
2223

2324
import javax.net.ssl.SSLSocketFactory;
@@ -545,12 +546,34 @@ void testSimpleRabbitListenerContainerFactoryWithCustomSettings() {
545546

546547
@Test
547548
@EnabledForJreRange(min = JRE.JAVA_21)
548-
void shouldConfigureVirtualThreads() {
549+
void shouldConfigureVirtualThreadsForSimpleListener() {
549550
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true").run((context) -> {
550551
SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory = context
551552
.getBean("rabbitListenerContainerFactory", SimpleRabbitListenerContainerFactory.class);
552553
assertThat(rabbitListenerContainerFactory).extracting("taskExecutor")
553554
.isInstanceOf(VirtualThreadTaskExecutor.class);
555+
Object taskExecutor = ReflectionTestUtils.getField(rabbitListenerContainerFactory, "taskExecutor");
556+
Object virtualThread = ReflectionTestUtils.getField(taskExecutor, "virtualThreadFactory");
557+
Thread threadCreated = ((ThreadFactory) virtualThread).newThread(mock(Runnable.class));
558+
assertThat(threadCreated.getName()).containsPattern("rabbit-simple-[0-9]+");
559+
560+
});
561+
}
562+
563+
@Test
564+
@EnabledForJreRange(min = JRE.JAVA_21)
565+
void shouldConfigureVirtualThreadsForDirectListener() {
566+
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true").run((context) -> {
567+
DirectRabbitListenerContainerFactoryConfigurer rabbitListenerContainerFactory = context.getBean(
568+
"directRabbitListenerContainerFactoryConfigurer",
569+
DirectRabbitListenerContainerFactoryConfigurer.class);
570+
assertThat(rabbitListenerContainerFactory).extracting("taskExecutor")
571+
.isInstanceOf(VirtualThreadTaskExecutor.class);
572+
Object taskExecutor = ReflectionTestUtils.getField(rabbitListenerContainerFactory, "taskExecutor");
573+
Object virtualThread = ReflectionTestUtils.getField(taskExecutor, "virtualThreadFactory");
574+
Thread threadCreated = ((ThreadFactory) virtualThread).newThread(mock(Runnable.class));
575+
assertThat(threadCreated.getName()).containsPattern("rabbit-direct-[0-9]+");
576+
554577
});
555578
}
556579

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/pulsar/PulsarAutoConfigurationTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import java.util.concurrent.ThreadFactory;
2122
import java.util.concurrent.TimeUnit;
2223

2324
import com.github.benmanes.caffeine.cache.Caffeine;
@@ -69,6 +70,7 @@
6970
import org.springframework.pulsar.core.ReaderBuilderCustomizer;
7071
import org.springframework.pulsar.core.SchemaResolver;
7172
import org.springframework.pulsar.core.TopicResolver;
73+
import org.springframework.test.util.ReflectionTestUtils;
7274

7375
import static org.assertj.core.api.Assertions.assertThat;
7476
import static org.mockito.Mockito.mock;
@@ -506,6 +508,10 @@ void whenVirtualThreadsAreEnabledOnJava21AndLaterListenerContainerShouldUseVirtu
506508
.getBean(ConcurrentPulsarListenerContainerFactory.class);
507509
assertThat(factory.getContainerProperties().getConsumerTaskExecutor())
508510
.isInstanceOf(VirtualThreadTaskExecutor.class);
511+
Object taskExecutor = factory.getContainerProperties().getConsumerTaskExecutor();
512+
Object virtualThread = ReflectionTestUtils.getField(taskExecutor, "virtualThreadFactory");
513+
Thread threadCreated = ((ThreadFactory) virtualThread).newThread(mock(Runnable.class));
514+
assertThat(threadCreated.getName()).containsPattern("pulsar-consumer-[0-9]+");
509515
});
510516
}
511517

@@ -561,6 +567,10 @@ void whenVirtualThreadsAreEnabledOnJava21AndLaterReaderShouldUseVirtualThreads()
561567
.getBean(DefaultPulsarReaderContainerFactory.class);
562568
assertThat(factory.getContainerProperties().getReaderTaskExecutor())
563569
.isInstanceOf(VirtualThreadTaskExecutor.class);
570+
Object taskExecutor = factory.getContainerProperties().getReaderTaskExecutor();
571+
Object virtualThread = ReflectionTestUtils.getField(taskExecutor, "virtualThreadFactory");
572+
Thread threadCreated = ((ThreadFactory) virtualThread).newThread(mock(Runnable.class));
573+
assertThat(threadCreated.getName()).containsPattern("pulsar-reader-[0-9]+");
564574
});
565575
}
566576

0 commit comments

Comments
 (0)