Hi Aleksej, Thank you. Really appreciate your prompt response. Hope this fix could be included in the next release (8u122?).
Best Regards, Pango Chan 2016-12-15 20:04 GMT+09:00 Aleks Efimov <aleksej.efi...@oracle.com>: > Hi Pango, > The backport is done and I will send backport and review request for JDK8 > later today (I'm pending testing results). > > Best Regards, > Aleksej > > > On 15/12/16 05:41, Pango wrote: >> >> Hi all, >> >> May I ask has there been any progress on this issue? >> >> Actually we are also struggling with this problem. The software that >> we are working on do publish with 0.0.0.0 and we got this >> BindException while migrating to JDK 8. We tried several workarounds >> but it will be very inconvenient for the end users to follow. >> >> Now we are planning to release our product around next January, and >> really hope that there will be some good news announced by then. >> >> It would be very appreciated if anyone can give some information >> regarding the backport of this fix to JDK 8 update in advance. >> >> Thanks for all your hard work and contributions. >> >> Best regards, >> Pango Chan >> >> >> 2016-08-04 09:35 GMT+09:00 KUBOTA Yuji <kubota.y...@gmail.com>: >>> >>> 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 >>>>>>> >>>>>>> >> >> > -- Best regards, Pango Chan