Hi Aleksej, Thank you very much! If you need some help about the patch, please mention me :)
Thanks, Yuji 2016-08-03 19:56 GMT+09:00 Aleks Efimov <aleksej.efi...@oracle.com>: > Hi Yuji, > > I've created JDK8 backport [1] for this issue and will work on it in the > upcoming months. > > Best Regards, > > Aleksej > > [1] https://bugs.openjdk.java.net/browse/JDK-8162941 > > > > On 02/08/16 08:33, KUBOTA Yuji wrote: >> >> Hi all, >> >> Could you let me know when this fix will be backport to JDK 8? >> We need this backport to migrate our system from JDK 7 to JDK 8. >> >> Thanks, >> Yuji >> >> 2016-02-10 10:17 GMT+09:00 KUBOTA Yuji <kubota.y...@gmail.com>: >>> >>> Hi Miroslav, >>> >>> Thank you for your sponsor! : >>> https://bugs.openjdk.java.net/browse/JDK-8146086 >>> >>> Can I ask the schedule when does this fix backport to JDK8 ? >>> >>> Thanks, >>> Yuji >>> >>> 2015-12-02 22:39 GMT+09:00 Miroslav Kos <miroslav....@oracle.com>: >>>> >>>> Hi Yuji, >>>> thanks for the patch - it fixes the issue and looks ok to me. I'll >>>> integrate >>>> it to standalone JAX-WS repo and it will be integrated into openjdk >>>> during >>>> next syncup. >>>> >>>> Thanks >>>> Miran >>>> >>>> >>>> >>>> >>>> On 01/12/15 11:11, KUBOTA Yuji wrote: >>>>> >>>>> Hi Miroslav and all, >>>>> >>>>> Could you please review the below issue and patch? >>>>> >>>>> I got the advice by Alan at net-dev. So I want to ask you. >>>>> >>>>> http://mail.openjdk.java.net/pipermail/net-dev/2015-December/009361.html >>>>> >>>>> ---- >>>>> I'm at the HackerGarten @ JavaOne15, and write a patch for OpenJDK >>>>> community. This's second times from JavaOne14. :) >>>>> >>>>> We find an unexpected exception in JAX-WS, so I write a patch to fix >>>>> it. >>>>> We think that this issue may block the migration to JDK9 from JDK7. >>>>> >>>>> If we bind 0.0.0.0 ( using as wildcard ) to publish multiple as the >>>>> following test code, JDK9 (and JDK8) returns "java.net.BindException: >>>>> Address already in use.” as the below. But JDK7 does NOT return the >>>>> exception. >>>>> >>>>> - Test code for reproduce >>>>> --- >>>>> import javax.jws.*; >>>>> import javax.xml.ws.*; >>>>> >>>>> public class WSTest{ >>>>> >>>>> @WebService >>>>> public static class Method1{ >>>>> @WebMethod >>>>> public String getMethod1Value(){ >>>>> return "from Method1"; >>>>> } >>>>> } >>>>> >>>>> @WebService >>>>> public static class Method2{ >>>>> @WebMethod >>>>> public String getMethod2Value(){ >>>>> return "from Method2"; >>>>> } >>>>> } >>>>> >>>>> public static void main(String[] args) throws Exception{ >>>>> Endpoint endPoint1 = >>>>> Endpoint.publish("http://0.0.0.0:8081/method1", >>>>> new >>>>> Method1()); >>>>> Endpoint endPoint2 = >>>>> Endpoint.publish("http://0.0.0.0:8081/method2", >>>>> new >>>>> Method2()); >>>>> >>>>> System.out.println("Sleep 3 secs..."); >>>>> >>>>> Thread.sleep(3000); >>>>> >>>>> endPoint2.stop(); >>>>> endPoint1.stop(); >>>>> } >>>>> >>>>> } >>>>> --- >>>>> >>>>> - StackTrace >>>>> --- >>>>> Exception in thread "main" >>>>> com.sun.xml.internal.ws.server.ServerRtException: Server Runtime >>>>> Error: java.net.BindException: Address already in use >>>>> at >>>>> >>>>> com.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(ServerMgr.java:117) >>>>> at >>>>> >>>>> com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:64) >>>>> at >>>>> >>>>> com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:232) >>>>> at >>>>> >>>>> com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:126) >>>>> at javax.xml.ws.Endpoint.publish(Endpoint.java:240) >>>>> at wstest.WSTest.main(WSTest.java:27) >>>>> Caused by: java.net.BindException: Address already in use >>>>> at sun.nio.ch.Net.bind0(Native Method) >>>>> at sun.nio.ch.Net.bind(Net.java:432) >>>>> at sun.nio.ch.Net.bind(Net.java:424) >>>>> at >>>>> >>>>> sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) >>>>> at >>>>> sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) >>>>> at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:102) >>>>> at >>>>> sun.net.httpserver.HttpServerImpl.<init>(HttpServerImpl.java:50) >>>>> at >>>>> >>>>> sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(DefaultHttpServerProvider.java:35) >>>>> at >>>>> com.sun.net.httpserver.HttpServer.create(HttpServer.java:130) >>>>> at >>>>> >>>>> com.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(ServerMgr.java:86) >>>>> ... 5 more >>>>> ----- >>>>> >>>>> To publishes the Endpoint, JAX-WS checks whether the HttpContext has >>>>> been created by given address, then creates a HttpContext if do not >>>>> exist. >>>>> If we sets 0.0.0.0 as given address, JAX-WS checks by >>>>> ServerSocket#getLocalSocketAddress() (server local address), so >>>>> returns BindException when 0.0.0.0 has been blinded already. >>>>> >>>>> Why so? JAX_WS-941[1] fixes NPE in Endpoint.stop but do not think >>>>> about above situation. And JAX_WS-941 does not back port to JDK7. >>>>> >>>>> So I write a patch which is based jdk9/dev/jaxws >>>>> (changeset:637:2d84c6f4cbba) to fix the BindException with JAX_WS-941. >>>>> >>>>> Please review this patch :) >>>>> >>>>> [1]: https://java.net/jira/browse/JAX_WS-941 >>>>> >>>>> - Patch >>>>> --- >>>>> diff -r 2d84c6f4cbba >>>>> >>>>> >>>>> src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java >>>>> --- >>>>> >>>>> a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java >>>>> Thu Oct 22 08:47:47 2015 -0700 >>>>> +++ >>>>> >>>>> b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/http/server/ServerMgr.java >>>>> Tue Oct 27 19:48:35 2015 +0900 >>>>> @@ -38,6 +38,7 @@ >>>>> import java.util.concurrent.ExecutorService; >>>>> import java.util.concurrent.Executors; >>>>> import java.util.logging.Logger; >>>>> +import java.util.Optional; >>>>> >>>>> /** >>>>> * Manages all the WebService HTTP servers created by JAXWS runtime. >>>>> @@ -81,24 +82,38 @@ >>>>> 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(); >>>>> + final int finalPortNum = port; >>>>> + Optional<ServerState> stateOpt = >>>>> + servers.values() >>>>> + .stream() >>>>> + .filter(s -> s.getServer() >>>>> + .getAddress() >>>>> + .getPort() == >>>>> finalPortNum) >>>>> + .findAny(); >>>>> >>>>> - // 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(); >>>>> + if (inetAddress.getAddress().isAnyLocalAddress() >>>>> && >>>>> + stateOpt.isPresent()) { >>>>> + state = stateOpt.get(); >>>>> + } else { >>>>> + 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(); >>>>> >>>>> - logger.fine("HTTP server started = "+inetAddress); >>>>> - state = new ServerState(server, path); >>>>> - servers.put(inetAddress, state); >>>>> - return context; >>>>> + // 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(); >>>>> --- >>>>> >>>>> Thanks, >>>>> Yuji >>>> >>>> >