Unexpected BindException in Endpoint.publish

Pango pango853 at gmail.com
Fri Dec 16 05:32:10 UTC 2016


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.efimov at 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.yuji at 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.efimov at 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.yuji at 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.kos at 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


More information about the core-libs-dev mailing list