Unexpected BindException in Endpoint.publish
Aleks Efimov
aleksej.efimov at oracle.com
Thu Dec 15 11:04:26 UTC 2016
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
>>>>>>
>
>
More information about the core-libs-dev
mailing list