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




Reply via email to