aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraefimov <none@none>2016-12-20 14:07:28 +0300
committeraefimov <none@none>2016-12-20 14:07:28 +0300
commit326ca5d9b15779756456c14e693b536e0f1e9d70 (patch)
treec071da3027a5ac3ad6788f887e08394d23933c4f
parent2112513363a62e2a28d8d2c1f02d9be23f2b720f (diff)
downloadjdk8u_jaxws-326ca5d9b15779756456c14e693b536e0f1e9d70.tar.gz
8146086: Publishing two webservices on same port fails with "java.net.BindException: Address already in use"
Reviewed-by: coffeys
-rw-r--r--src/share/jaxws_classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java51
1 files changed, 32 insertions, 19 deletions
diff --git a/src/share/jaxws_classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java b/src/share/jaxws_classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java
index a16ec36b..a579a3c7 100644
--- a/src/share/jaxws_classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java
+++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -81,24 +81,37 @@ final class ServerMgr {
synchronized(servers) {
state = servers.get(inetAddress);
if (state == null) {
- logger.fine("Creating new HTTP Server at "+inetAddress);
- // Creates server with default socket backlog
- server = HttpServer.create(inetAddress, 0);
- server.setExecutor(Executors.newCachedThreadPool());
- String path = url.toURI().getPath();
- logger.fine("Creating HTTP Context at = "+path);
- HttpContext context = server.createContext(path);
- server.start();
-
- // we have to get actual inetAddress from server, which can differ from the original in some cases.
- // e.g. A port number of zero will let the system pick up an ephemeral port in a bind operation,
- // or IP: 0.0.0.0 - which is used to monitor network traffic from any valid IP address
- inetAddress = server.getAddress();
-
- logger.fine("HTTP server started = "+inetAddress);
- state = new ServerState(server, path);
- servers.put(inetAddress, state);
- return context;
+ final int finalPortNum = port;
+ for (ServerState s: servers.values()) {
+ if (s.getServer()
+ .getAddress()
+ .getPort() == finalPortNum) {
+ state = s;
+ break;
+ }
+ }
+
+ if (!inetAddress.getAddress().isAnyLocalAddress() ||
+ state == null) {
+ logger.fine("Creating new HTTP Server at "+inetAddress);
+ // Creates server with default socket backlog
+ server = HttpServer.create(inetAddress, 0);
+ server.setExecutor(Executors.newCachedThreadPool());
+ String path = url.toURI().getPath();
+ logger.fine("Creating HTTP Context at = "+path);
+ HttpContext context = server.createContext(path);
+ server.start();
+
+ // we have to get actual inetAddress from server, which can differ from the original in some cases.
+ // e.g. A port number of zero will let the system pick up an ephemeral port in a bind operation,
+ // or IP: 0.0.0.0 - which is used to monitor network traffic from any valid IP address
+ inetAddress = server.getAddress();
+
+ logger.fine("HTTP server started = "+inetAddress);
+ state = new ServerState(server, path);
+ servers.put(inetAddress, state);
+ return context;
+ }
}
}
server = state.getServer();