Skip to content

Commit 7014cc5

Browse files
committed
Merge pull request #19475 from bono007
* pr/19475: Polish "Add 'threads' configuration group for embedded containers" Add 'threads' configuration group for embedded containers Closes gh-19475
2 parents 5a687df + 5893786 commit 7014cc5

File tree

10 files changed

+388
-115
lines changed

10 files changed

+388
-115
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java

Lines changed: 238 additions & 81 deletions
Large diffs are not rendered by default.

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/JettyWebServerFactoryCustomizer.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,11 @@ public void customize(ConfigurableJettyWebServerFactory factory) {
7777
ServerProperties properties = this.serverProperties;
7878
ServerProperties.Jetty jettyProperties = properties.getJetty();
7979
factory.setUseForwardHeaders(getOrDeduceUseForwardHeaders());
80-
factory.setThreadPool(determineThreadPool(jettyProperties));
80+
ServerProperties.Jetty.Threads threadProperties = jettyProperties.getThreads();
81+
factory.setThreadPool(determineThreadPool(jettyProperties.getThreads()));
8182
PropertyMapper propertyMapper = PropertyMapper.get();
82-
propertyMapper.from(jettyProperties::getAcceptors).whenNonNull().to(factory::setAcceptors);
83-
propertyMapper.from(jettyProperties::getSelectors).whenNonNull().to(factory::setSelectors);
83+
propertyMapper.from(threadProperties::getAcceptors).whenNonNull().to(factory::setAcceptors);
84+
propertyMapper.from(threadProperties::getSelectors).whenNonNull().to(factory::setSelectors);
8485
propertyMapper.from(properties::getMaxHttpHeaderSize).whenNonNull().asInt(DataSize::toBytes)
8586
.when(this::isPositive).to((maxHttpHeaderSize) -> factory
8687
.addServerCustomizers(new MaxHttpHeaderSizeCustomizer(maxHttpHeaderSize)));
@@ -141,12 +142,12 @@ else if (handler instanceof HandlerCollection) {
141142
});
142143
}
143144

144-
private ThreadPool determineThreadPool(ServerProperties.Jetty properties) {
145+
private ThreadPool determineThreadPool(ServerProperties.Jetty.Threads properties) {
145146
BlockingQueue<Runnable> queue = determineBlockingQueue(properties.getMaxQueueCapacity());
146-
int maxThreadCount = (properties.getMaxThreads() > 0) ? properties.getMaxThreads() : 200;
147-
int minThreadCount = (properties.getMinThreads() > 0) ? properties.getMinThreads() : 8;
148-
int threadIdleTimeout = (properties.getThreadIdleTimeout() != null)
149-
? (int) properties.getThreadIdleTimeout().toMillis() : 60000;
147+
int maxThreadCount = (properties.getMax() > 0) ? properties.getMax() : 200;
148+
int minThreadCount = (properties.getMin() > 0) ? properties.getMin() : 8;
149+
int threadIdleTimeout = (properties.getIdleTimeout() != null) ? (int) properties.getIdleTimeout().toMillis()
150+
: 60000;
150151
return new QueuedThreadPool(maxThreadCount, minThreadCount, threadIdleTimeout, queue);
151152
}
152153

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,10 @@ public void customize(ConfigurableTomcatWebServerFactory factory) {
8484
propertyMapper.from(tomcatProperties::getBackgroundProcessorDelay).whenNonNull().as(Duration::getSeconds)
8585
.as(Long::intValue).to(factory::setBackgroundProcessorDelay);
8686
customizeRemoteIpValve(factory);
87-
propertyMapper.from(tomcatProperties::getMaxThreads).when(this::isPositive)
88-
.to((maxThreads) -> customizeMaxThreads(factory, tomcatProperties.getMaxThreads()));
89-
propertyMapper.from(tomcatProperties::getMinSpareThreads).when(this::isPositive)
87+
ServerProperties.Tomcat.Threads threadProperties = tomcatProperties.getThreads();
88+
propertyMapper.from(threadProperties::getMax).when(this::isPositive)
89+
.to((maxThreads) -> customizeMaxThreads(factory, threadProperties.getMax()));
90+
propertyMapper.from(threadProperties::getMinSpare).when(this::isPositive)
9091
.to((minSpareThreads) -> customizeMinThreads(factory, minSpareThreads));
9192
propertyMapper.from(this.serverProperties.getMaxHttpHeaderSize()).whenNonNull().asInt(DataSize::toBytes)
9293
.when(this::isPositive)

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/UndertowWebServerFactoryCustomizer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,9 @@ private void mapUndertowProperties(ConfigurableUndertowWebServerFactory factory,
8989
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
9090
Undertow properties = this.serverProperties.getUndertow();
9191
map.from(properties::getBufferSize).whenNonNull().asInt(DataSize::toBytes).to(factory::setBufferSize);
92-
map.from(properties::getIoThreads).to(factory::setIoThreads);
93-
map.from(properties::getWorkerThreads).to(factory::setWorkerThreads);
92+
ServerProperties.Undertow.Threads threadProperties = properties.getThreads();
93+
map.from(threadProperties::getIo).to(factory::setIoThreads);
94+
map.from(threadProperties::getWorker).to(factory::setWorkerThreads);
9495
map.from(properties::getDirectBuffers).to(factory::setUseDirectBuffers);
9596
map.from(properties::getMaxHttpPostSize).as(DataSize::toBytes).when(this::isPositive)
9697
.to(options.server(UndertowOptions.MAX_ENTITY_SIZE));

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java

Lines changed: 106 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.InetAddress;
2121
import java.net.URI;
2222
import java.nio.charset.StandardCharsets;
23+
import java.time.Duration;
2324
import java.util.Collections;
2425
import java.util.HashMap;
2526
import java.util.Map;
@@ -75,6 +76,7 @@
7576
* @author Andrew McGhie
7677
* @author HaiTao Zhang
7778
* @author Rafiullah Hamedy
79+
* @author Chris Bono
7880
*/
7981
class ServerPropertiesTests {
8082

@@ -207,40 +209,109 @@ void testCustomizeHeaderSizeUseBytesByDefault() {
207209
assertThat(this.properties.getMaxHttpHeaderSize()).isEqualTo(DataSize.ofKilobytes(1));
208210
}
209211

212+
@Test
213+
void testCustomizeTomcatMaxThreads() {
214+
bind("server.tomcat.threads.max", "10");
215+
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(10);
216+
}
217+
218+
@Deprecated
219+
@Test
220+
void testCustomizeTomcatMaxThreadsDeprecated() {
221+
bind("server.tomcat.maxThreads", "10");
222+
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(10);
223+
}
224+
225+
@Test
226+
void testCustomizeTomcatMinSpareThreads() {
227+
bind("server.tomcat.threads.min-spare", "10");
228+
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
229+
}
230+
231+
@Deprecated
232+
@Test
233+
void testCustomizeTomcatMinSpareThreadsDeprecated() {
234+
bind("server.tomcat.min-spare-threads", "10");
235+
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
236+
}
237+
210238
@Test
211239
void testCustomizeJettyAcceptors() {
240+
bind("server.jetty.threads.acceptors", "10");
241+
assertThat(this.properties.getJetty().getThreads().getAcceptors()).isEqualTo(10);
242+
}
243+
244+
@Deprecated
245+
@Test
246+
void testCustomizeJettyAcceptorsDeprecated() {
212247
bind("server.jetty.acceptors", "10");
213-
assertThat(this.properties.getJetty().getAcceptors()).isEqualTo(10);
248+
assertThat(this.properties.getJetty().getThreads().getAcceptors()).isEqualTo(10);
214249
}
215250

216251
@Test
217252
void testCustomizeJettySelectors() {
253+
bind("server.jetty.threads.selectors", "10");
254+
assertThat(this.properties.getJetty().getThreads().getSelectors()).isEqualTo(10);
255+
}
256+
257+
@Deprecated
258+
@Test
259+
void testCustomizeJettySelectorsDeprecated() {
218260
bind("server.jetty.selectors", "10");
219261
assertThat(this.properties.getJetty().getSelectors()).isEqualTo(10);
262+
assertThat(this.properties.getJetty().getThreads().getSelectors()).isEqualTo(10);
220263
}
221264

222265
@Test
223266
void testCustomizeJettyMaxThreads() {
224-
bind("server.jetty.max-threads", "10");
225-
assertThat(this.properties.getJetty().getMaxThreads()).isEqualTo(10);
267+
bind("server.jetty.threads.max", "10");
268+
assertThat(this.properties.getJetty().getThreads().getMax()).isEqualTo(10);
269+
}
270+
271+
@Deprecated
272+
@Test
273+
void testCustomizeJettyMaxThreadsDeprecated() {
274+
bind("server.jetty.maxThreads", "10");
275+
assertThat(this.properties.getJetty().getThreads().getMax()).isEqualTo(10);
226276
}
227277

228278
@Test
229279
void testCustomizeJettyMinThreads() {
230-
bind("server.jetty.min-threads", "10");
231-
assertThat(this.properties.getJetty().getMinThreads()).isEqualTo(10);
280+
bind("server.jetty.threads.min", "10");
281+
assertThat(this.properties.getJetty().getThreads().getMin()).isEqualTo(10);
282+
}
283+
284+
@Deprecated
285+
@Test
286+
void testCustomizeJettyMinThreadsDeprecated() {
287+
bind("server.jetty.minThreads", "10");
288+
assertThat(this.properties.getJetty().getThreads().getMin()).isEqualTo(10);
232289
}
233290

234291
@Test
235292
void testCustomizeJettyIdleTimeout() {
293+
bind("server.jetty.threads.idle-timeout", "10s");
294+
assertThat(this.properties.getJetty().getThreads().getIdleTimeout()).isEqualTo(Duration.ofSeconds(10));
295+
}
296+
297+
@Deprecated
298+
@Test
299+
void testCustomizeJettyIdleTimeoutDeprecated() {
236300
bind("server.jetty.thread-idle-timeout", "10s");
237-
assertThat(this.properties.getJetty().getThreadIdleTimeout()).hasSeconds(10);
301+
assertThat(this.properties.getJetty().getThreads().getIdleTimeout()).hasSeconds(10);
238302
}
239303

240304
@Test
241305
void testCustomizeJettyMaxQueueCapacity() {
306+
bind("server.jetty.threads.max-queue-capacity", "5150");
307+
assertThat(this.properties.getJetty().getThreads().getMaxQueueCapacity()).isEqualTo(5150);
308+
}
309+
310+
@Deprecated
311+
@Test
312+
void testCustomizeJettyMaxQueueCapacityDeprecated() {
242313
bind("server.jetty.max-queue-capacity", "5150");
243-
assertThat(this.properties.getJetty().getMaxQueueCapacity()).isEqualTo(5150);
314+
assertThat(this.properties.getJetty().getThreads().getMaxQueueCapacity()).isEqualTo(5150);
244315
}
245316

246317
@Test
@@ -257,6 +328,32 @@ void testCustomizeUndertowSocketOption() {
257328
"true");
258329
}
259330

331+
@Test
332+
void testCustomizeUndertowIoThreads() {
333+
bind("server.undertow.threads.io", "4");
334+
assertThat(this.properties.getUndertow().getThreads().getIo()).isEqualTo(4);
335+
}
336+
337+
@Deprecated
338+
@Test
339+
void testCustomizeUndertowIoThreadsDeprecated() {
340+
bind("server.undertow.ioThreads", "4");
341+
assertThat(this.properties.getUndertow().getThreads().getIo()).isEqualTo(4);
342+
}
343+
344+
@Test
345+
void testCustomizeUndertowWorkerThreads() {
346+
bind("server.undertow.threads.worker", "10");
347+
assertThat(this.properties.getUndertow().getThreads().getWorker()).isEqualTo(10);
348+
}
349+
350+
@Deprecated
351+
@Test
352+
void testCustomizeUndertowWorkerThreadsDeprecated() {
353+
bind("server.undertow.workerThreads", "10");
354+
assertThat(this.properties.getUndertow().getThreads().getWorker()).isEqualTo(10);
355+
}
356+
260357
@Test
261358
void testCustomizeJettyAccessLog() {
262359
Map<String, String> map = new HashMap<>();
@@ -295,12 +392,12 @@ void tomcatMaxConnectionsMatchesProtocolDefault() throws Exception {
295392

296393
@Test
297394
void tomcatMaxThreadsMatchesProtocolDefault() throws Exception {
298-
assertThat(this.properties.getTomcat().getMaxThreads()).isEqualTo(getDefaultProtocol().getMaxThreads());
395+
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(getDefaultProtocol().getMaxThreads());
299396
}
300397

301398
@Test
302399
void tomcatMinSpareThreadsMatchesProtocolDefault() throws Exception {
303-
assertThat(this.properties.getTomcat().getMinSpareThreads())
400+
assertThat(this.properties.getTomcat().getThreads().getMinSpare())
304401
.isEqualTo(getDefaultProtocol().getMinSpareThreads());
305402
}
306403

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/JettyWebServerFactoryCustomizerTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,15 @@ void threadPoolMinThreadsCanBeCustomized() {
179179

180180
@Test
181181
void threadPoolIdleTimeoutCanBeCustomized() {
182-
bind("server.jetty.thread-idle-timeout=100s");
182+
bind("server.jetty.threads.idle-timeout=100s");
183183
JettyWebServer server = customizeAndGetServer();
184184
QueuedThreadPool threadPool = (QueuedThreadPool) server.getServer().getThreadPool();
185185
assertThat(threadPool.getIdleTimeout()).isEqualTo(100000);
186186
}
187187

188188
@Test
189189
void threadPoolWithMaxQueueCapacityEqualToZeroCreateSynchronousQueue() {
190-
bind("server.jetty.max-queue-capacity=0");
190+
bind("server.jetty.threads.max-queue-capacity=0");
191191
JettyWebServer server = customizeAndGetServer();
192192
ThreadPool threadPool = server.getServer().getThreadPool();
193193
BlockingQueue<?> queue = getQueue(threadPool);
@@ -197,8 +197,8 @@ void threadPoolWithMaxQueueCapacityEqualToZeroCreateSynchronousQueue() {
197197

198198
@Test
199199
void threadPoolWithMaxQueueCapacityEqualToZeroCustomizesThreadPool() {
200-
bind("server.jetty.max-queue-capacity=0", "server.jetty.min-threads=100", "server.jetty.max-threads=100",
201-
"server.jetty.thread-idle-timeout=6s");
200+
bind("server.jetty.threads.max-queue-capacity=0", "server.jetty.min-threads=100",
201+
"server.jetty.max-threads=100", "server.jetty.threads.idle-timeout=6s");
202202
JettyWebServer server = customizeAndGetServer();
203203
QueuedThreadPool threadPool = (QueuedThreadPool) server.getServer().getThreadPool();
204204
assertThat(threadPool.getMinThreads()).isEqualTo(100);
@@ -208,7 +208,7 @@ void threadPoolWithMaxQueueCapacityEqualToZeroCustomizesThreadPool() {
208208

209209
@Test
210210
void threadPoolWithMaxQueueCapacityPositiveCreateBlockingArrayQueue() {
211-
bind("server.jetty.max-queue-capacity=1234");
211+
bind("server.jetty.threads.max-queue-capacity=1234");
212212
JettyWebServer server = customizeAndGetServer();
213213
ThreadPool threadPool = server.getServer().getThreadPool();
214214
BlockingQueue<?> queue = getQueue(threadPool);
@@ -219,8 +219,8 @@ void threadPoolWithMaxQueueCapacityPositiveCreateBlockingArrayQueue() {
219219

220220
@Test
221221
void threadPoolWithMaxQueueCapacityPositiveCustomizesThreadPool() {
222-
bind("server.jetty.max-queue-capacity=1234", "server.jetty.min-threads=10", "server.jetty.max-threads=150",
223-
"server.jetty.thread-idle-timeout=3s");
222+
bind("server.jetty.threads.max-queue-capacity=1234", "server.jetty.min-threads=10",
223+
"server.jetty.max-threads=150", "server.jetty.threads.idle-timeout=3s");
224224
JettyWebServer server = customizeAndGetServer();
225225
QueuedThreadPool threadPool = (QueuedThreadPool) server.getServer().getThreadPool();
226226
assertThat(threadPool.getMinThreads()).isEqualTo(10);

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,8 @@ void errorReportValveIsConfiguredToNotReportStackTraces() {
345345

346346
@Test
347347
void testCustomizeMinSpareThreads() {
348-
bind("server.tomcat.min-spare-threads=10");
349-
assertThat(this.serverProperties.getTomcat().getMinSpareThreads()).isEqualTo(10);
348+
bind("server.tomcat.threads.min-spare=10");
349+
assertThat(this.serverProperties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
350350
}
351351

352352
@Test

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/UndertowWebServerFactoryCustomizerTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,22 @@ void customMaxCookies() {
132132
assertThat(boundServerOption(UndertowOptions.MAX_COOKIES)).isEqualTo(4);
133133
}
134134

135+
@Test
136+
void customizeIoThreads() {
137+
bind("server.undertow.threads.io=4");
138+
ConfigurableUndertowWebServerFactory factory = mock(ConfigurableUndertowWebServerFactory.class);
139+
this.customizer.customize(factory);
140+
verify(factory).setIoThreads(4);
141+
}
142+
143+
@Test
144+
void customizeWorkerThreads() {
145+
bind("server.undertow.threads.worker=10");
146+
ConfigurableUndertowWebServerFactory factory = mock(ConfigurableUndertowWebServerFactory.class);
147+
this.customizer.customize(factory);
148+
verify(factory).setWorkerThreads(10);
149+
}
150+
135151
@Test
136152
void allowEncodedSlashes() {
137153
bind("server.undertow.allow-encoded-slash=true");

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryCustomizerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ void customizeServletDisplayName() {
139139
@Test
140140
void testCustomizeTomcatMinSpareThreads() {
141141
Map<String, String> map = new HashMap<>();
142-
map.put("server.tomcat.min-spare-threads", "10");
142+
map.put("server.tomcat.threads.min-spare", "10");
143143
bindProperties(map);
144-
assertThat(this.properties.getTomcat().getMinSpareThreads()).isEqualTo(10);
144+
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
145145
}
146146

147147
@Test
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
server.compression.enabled: true
22
server.compression.min-response-size: 1
3-
server.jetty.acceptors=2
3+
server.jetty.threads.acceptors=2

0 commit comments

Comments
 (0)