Reputation:
I'm trying configure an application in Spring Boot
with two differents ports, but I haven't got still.
My first approximation has been with two controllers and I have defined a @Bean
inside the two controller with container.setPort(8080);
And my second approximation has been add the actuator dependency and change the port of the management, but my application don't run. It shows:
Address already in use: bind
How can I confiure an application with two ports? I want one port for admin and the other port is for consults of my api.
Upvotes: 35
Views: 64833
Reputation: 3475
As is has been mentioned before, server.port
and management.port
along with management.context-path
properties could be set to make the embedded container to listen on different ports (management-related properties to access Actuator
endpoints).
To listen on ports other than server.port
and management.port
:
@Configuration
public class EmbeddedTomcatConfiguration {
@Value("${server.additionalPorts}")
private String additionalPorts;
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
private Connector[] additionalConnector() {
if (StringUtils.isBlank(this.additionalPorts)) {
return null;
}
String[] ports = this.additionalPorts.split(",");
List<Connector> result = new ArrayList<>();
for (String port : ports) {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(Integer.valueOf(port));
result.add(connector);
}
return result.toArray(new Connector[] {});
}
}
application.yml
server:
port: ${appPort:8800}
additionalPorts: 8881,8882
Application.java
@SpringBootApplication
@ComponentScan(...)
@Import(EmbeddedTomcatConfiguration.class)
public Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
I recently blogged about this topic at:
Upvotes: 35
Reputation: 151
If only one additional port is to be opened, the following is sufficient (Kotlin):
@Configuration
class AdditionalEndpointConfig {
@Bean
@ConditionalOnProperty(PORT_PROPERTY)
fun tomcatServletWebServerFactory(@Value("\${$PORT_PROPERTY}") additionalPort: Int) =
TomcatServletWebServerFactory().apply {
addAdditionalTomcatConnectors(
Connector("org.apache.coyote.http11.Http11NioProtocol").apply {
scheme = "http"
port = additionalPort
})
}
companion object {
const val PORT_PROPERTY = "server.additional.port"
}
}
Upvotes: 1
Reputation: 439
To run 2 or more applications within a single project or change the default port, you can perform the action like this
@SpringBootApplication
public class NewApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(NewApplication .class);
app.setDefaultProperties(Collections.singletonMap("server.port", "8083"));
app.run(args);
}
}
Upvotes: 1
Reputation: 797
Since springboot 2, EmbeddedServletContainerFactory
mentioned in ootero solution is no longer available, so you should use either TomcatServletWebServerFactory
or TomcatReactiveWebServerFactory
according to your context.
The solution stays the same aside from the factory injection :
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
Upvotes: 10