forked from spring-projects/spring-boot
-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Consolidate Undertow WebServers and simplify their constructors
Closes spring-projectsgh-21391 Co-authored-by: Phillip Webb <[email protected]>
- Loading branch information
1 parent
07958ac
commit eef3d95
Showing
11 changed files
with
823 additions
and
821 deletions.
There are no files selected for viewing
121 changes: 121 additions & 0 deletions
121
...main/java/org/springframework/boot/web/embedded/undertow/AccessLogHttpHandlerFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
/* | ||
* Copyright 2012-2020 the original author or authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package org.springframework.boot.web.embedded.undertow; | ||
|
||
import java.io.Closeable; | ||
import java.io.File; | ||
import java.io.IOException; | ||
import java.util.concurrent.TimeUnit; | ||
|
||
import io.undertow.Undertow; | ||
import io.undertow.server.HttpHandler; | ||
import io.undertow.server.handlers.accesslog.AccessLogHandler; | ||
import io.undertow.server.handlers.accesslog.DefaultAccessLogReceiver; | ||
import org.xnio.OptionMap; | ||
import org.xnio.Options; | ||
import org.xnio.Xnio; | ||
import org.xnio.XnioWorker; | ||
|
||
import org.springframework.util.Assert; | ||
|
||
/** | ||
* A {@link HttpHandlerFactory} for an {@link AccessLogHandler}. | ||
* | ||
* @author Andy Wilkinson | ||
*/ | ||
class AccessLogHttpHandlerFactory implements HttpHandlerFactory { | ||
|
||
private final File directory; | ||
|
||
private final String pattern; | ||
|
||
private final String prefix; | ||
|
||
private final String suffix; | ||
|
||
private final boolean rotate; | ||
|
||
AccessLogHttpHandlerFactory(File directory, String pattern, String prefix, String suffix, boolean rotate) { | ||
this.directory = directory; | ||
this.pattern = pattern; | ||
this.prefix = prefix; | ||
this.suffix = suffix; | ||
this.rotate = rotate; | ||
} | ||
|
||
@Override | ||
public HttpHandler getHandler(HttpHandler next) { | ||
try { | ||
createAccessLogDirectoryIfNecessary(); | ||
XnioWorker worker = createWorker(); | ||
String baseName = (this.prefix != null) ? this.prefix : "access_log."; | ||
String formatString = (this.pattern != null) ? this.pattern : "common"; | ||
return new ClosableAccessLogHandler(next, worker, | ||
new DefaultAccessLogReceiver(worker, this.directory, baseName, this.suffix, this.rotate), | ||
formatString); | ||
} | ||
catch (IOException ex) { | ||
throw new IllegalStateException("Failed to create AccessLogHandler", ex); | ||
} | ||
} | ||
|
||
private void createAccessLogDirectoryIfNecessary() { | ||
Assert.state(this.directory != null, "Access log directory is not set"); | ||
if (!this.directory.isDirectory() && !this.directory.mkdirs()) { | ||
throw new IllegalStateException("Failed to create access log directory '" + this.directory + "'"); | ||
} | ||
} | ||
|
||
private XnioWorker createWorker() throws IOException { | ||
Xnio xnio = Xnio.getInstance(Undertow.class.getClassLoader()); | ||
return xnio.createWorker(OptionMap.builder().set(Options.THREAD_DAEMON, true).getMap()); | ||
} | ||
|
||
/** | ||
* {@link Closeable} variant of {@link AccessLogHandler}. | ||
*/ | ||
private static class ClosableAccessLogHandler extends AccessLogHandler implements Closeable { | ||
|
||
private final DefaultAccessLogReceiver accessLogReceiver; | ||
|
||
private final XnioWorker worker; | ||
|
||
ClosableAccessLogHandler(HttpHandler next, XnioWorker worker, DefaultAccessLogReceiver accessLogReceiver, | ||
String formatString) { | ||
super(next, accessLogReceiver, formatString, Undertow.class.getClassLoader()); | ||
this.worker = worker; | ||
this.accessLogReceiver = accessLogReceiver; | ||
} | ||
|
||
@Override | ||
public void close() throws IOException { | ||
try { | ||
this.accessLogReceiver.close(); | ||
this.worker.shutdown(); | ||
this.worker.awaitTermination(30, TimeUnit.SECONDS); | ||
} | ||
catch (IOException ex) { | ||
throw new RuntimeException(ex); | ||
} | ||
catch (InterruptedException ex) { | ||
Thread.currentThread().interrupt(); | ||
} | ||
} | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
95 changes: 95 additions & 0 deletions
95
...a/org/springframework/boot/web/embedded/undertow/DeploymentManagerHttpHandlerFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* Copyright 2012-2020 the original author or authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package org.springframework.boot.web.embedded.undertow; | ||
|
||
import java.io.Closeable; | ||
import java.io.IOException; | ||
|
||
import javax.servlet.ServletException; | ||
|
||
import io.undertow.server.HttpHandler; | ||
import io.undertow.server.HttpServerExchange; | ||
import io.undertow.servlet.api.DeploymentManager; | ||
|
||
import org.springframework.util.Assert; | ||
|
||
/** | ||
* {@link HttpHandlerFactory} that for a {@link DeploymentManager}. | ||
* | ||
* @author Andy Wilkinson | ||
* @author Phillip Webb | ||
*/ | ||
class DeploymentManagerHttpHandlerFactory implements HttpHandlerFactory { | ||
|
||
private final DeploymentManager deploymentManager; | ||
|
||
DeploymentManagerHttpHandlerFactory(DeploymentManager deploymentManager) { | ||
this.deploymentManager = deploymentManager; | ||
} | ||
|
||
@Override | ||
public HttpHandler getHandler(HttpHandler next) { | ||
Assert.state(next == null, "DeploymentManagerHttpHandlerFactory must be first"); | ||
return new DeploymentManagerHandler(this.deploymentManager); | ||
} | ||
|
||
DeploymentManager getDeploymentManager() { | ||
return this.deploymentManager; | ||
} | ||
|
||
/** | ||
* {@link HttpHandler} that delegates to a {@link DeploymentManager}. | ||
*/ | ||
static class DeploymentManagerHandler implements HttpHandler, Closeable { | ||
|
||
private final DeploymentManager deploymentManager; | ||
|
||
private final HttpHandler handler; | ||
|
||
DeploymentManagerHandler(DeploymentManager deploymentManager) { | ||
this.deploymentManager = deploymentManager; | ||
try { | ||
this.handler = deploymentManager.start(); | ||
} | ||
catch (ServletException ex) { | ||
throw new RuntimeException(ex); | ||
} | ||
} | ||
|
||
@Override | ||
public void handleRequest(HttpServerExchange exchange) throws Exception { | ||
this.handler.handleRequest(exchange); | ||
} | ||
|
||
@Override | ||
public void close() throws IOException { | ||
try { | ||
this.deploymentManager.stop(); | ||
this.deploymentManager.undeploy(); | ||
} | ||
catch (ServletException ex) { | ||
throw new RuntimeException(ex); | ||
} | ||
} | ||
|
||
DeploymentManager getDeploymentManager() { | ||
return this.deploymentManager; | ||
} | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
...boot/src/main/java/org/springframework/boot/web/embedded/undertow/HttpHandlerFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
/* | ||
* Copyright 2012-2020 the original author or authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package org.springframework.boot.web.embedded.undertow; | ||
|
||
import java.io.Closeable; | ||
|
||
import io.undertow.server.HttpHandler; | ||
|
||
import org.springframework.boot.web.server.GracefulShutdown; | ||
|
||
/** | ||
* Factory used by {@link UndertowServletWebServer} to add {@link HttpHandler | ||
* HttpHandlers}. Instances returned from this factory may optionally implement the | ||
* following interfaces: | ||
* <ul> | ||
* <li>{@link Closeable} - if they wish to be closed just before server stops.</li> | ||
* <li>{@link GracefulShutdown} - if they wish to manage graceful shutdown.</li> | ||
* </ul> | ||
* | ||
* @author Phillip Webb | ||
* @since 2.3.0 | ||
*/ | ||
@FunctionalInterface | ||
public interface HttpHandlerFactory { | ||
|
||
/** | ||
* Create the {@link HttpHandler} instance that should be added. | ||
* @param next the next handler in the chain | ||
* @return the new HTTP handler instance | ||
*/ | ||
HttpHandler getHandler(HttpHandler next); | ||
|
||
} |
Oops, something went wrong.