issue #2718 prevent NPE and IAE when changing Executor
Signed-off-by: olivier lamy <oliver.lamy@gmail.com>
This commit is contained in:
parent
45d5bd2cae
commit
669c70885f
|
@ -67,4 +67,32 @@
|
|||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk9</id>
|
||||
<activation>
|
||||
<jdk>[1.9,)</jdk>
|
||||
</activation>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>javax.xml</groupId>
|
||||
<artifactId>jaxws-api</artifactId>
|
||||
<version>2.0EA3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sun.xml.ws</groupId>
|
||||
<artifactId>jaxws-rt</artifactId>
|
||||
<version>2.3.0.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
<artifactId>javax.activation-api</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
|
|
|
@ -59,9 +59,9 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
|
|||
private InetSocketAddress _addr;
|
||||
|
||||
|
||||
private Map<String, JettyHttpContext> _contexts = new HashMap<String, JettyHttpContext>();
|
||||
private Map<String, JettyHttpContext> _contexts = new HashMap<>();
|
||||
|
||||
private Map<String, Connector> _connectors = new HashMap<String, Connector>();
|
||||
private Map<String, Connector> _connectors = new HashMap<>();
|
||||
|
||||
|
||||
public JettyHttpServer(Server server, boolean shared)
|
||||
|
@ -84,13 +84,14 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
|
|||
@Override
|
||||
public void bind(InetSocketAddress addr, int backlog) throws IOException
|
||||
{
|
||||
this._addr = addr;
|
||||
// check if there is already a connector listening
|
||||
Collection<NetworkConnector> connectors = _server.getBeans(NetworkConnector.class);
|
||||
if (connectors != null)
|
||||
{
|
||||
for (NetworkConnector connector : connectors)
|
||||
{
|
||||
if (connector.getPort() == addr.getPort()) {
|
||||
if (connector.getPort() == addr.getPort()||connector.getLocalPort() == addr.getPort()) {
|
||||
if (LOG.isDebugEnabled()) LOG.debug("server already bound to port " + addr.getPort() + ", no need to rebind");
|
||||
return;
|
||||
}
|
||||
|
@ -100,7 +101,7 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
|
|||
if (_serverShared)
|
||||
throw new IOException("jetty server is not bound to port " + addr.getPort());
|
||||
|
||||
this._addr = addr;
|
||||
|
||||
|
||||
if (LOG.isDebugEnabled()) LOG.debug("binding server to port " + addr.getPort());
|
||||
ServerConnector connector = new ServerConnector(_server);
|
||||
|
@ -153,9 +154,23 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
|
|||
throw new IllegalArgumentException("missing required 'executor' argument");
|
||||
ThreadPool threadPool = _server.getThreadPool();
|
||||
if (threadPool instanceof DelegatingThreadPool)
|
||||
((DelegatingThreadPool)_server.getThreadPool()).setExecutor(executor);
|
||||
else
|
||||
throw new UnsupportedOperationException("!DelegatingThreadPool");
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_server.isRunning())
|
||||
{
|
||||
_server.stop();
|
||||
}
|
||||
((DelegatingThreadPool) _server.getThreadPool()).setExecutor(executor);
|
||||
_server.start();
|
||||
}
|
||||
catch ( Exception e )
|
||||
{
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
} else {
|
||||
throw new UnsupportedOperationException( "!DelegatingThreadPool" );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
//
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
//
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
//
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
package org.eclipse.jetty.http.spi;
|
||||
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.ServerConnector;
|
||||
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.jws.WebMethod;
|
||||
import javax.jws.WebService;
|
||||
import javax.xml.ws.Endpoint;
|
||||
|
||||
public class TestEndpointMultiplePublishProblem
|
||||
{
|
||||
|
||||
private static String default_impl = System.getProperty("com.sun.net.httpserver.HttpServerProvider");
|
||||
|
||||
@BeforeClass
|
||||
public static void change_Impl()
|
||||
{
|
||||
System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName());
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void restore_Impl()
|
||||
{
|
||||
if(default_impl != null)
|
||||
{
|
||||
System.setProperty( "com.sun.net.httpserver.HttpServerProvider", default_impl );
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mainJetty() throws Exception {
|
||||
|
||||
Server jettyWebServer = new Server(new DelegatingThreadPool(new QueuedThreadPool()));
|
||||
ServerConnector connector = new ServerConnector(jettyWebServer);
|
||||
connector.setHost("localhost");
|
||||
connector.setPort(0);
|
||||
connector.setReuseAddress(true);
|
||||
jettyWebServer.addConnector(connector);
|
||||
jettyWebServer.setHandler(new ContextHandlerCollection());
|
||||
|
||||
JettyHttpServerProvider.setServer(jettyWebServer);
|
||||
|
||||
jettyWebServer.start();
|
||||
|
||||
Endpoint.publish(String.format("http://%s:%d/hello", "localhost", 0), new Ws());
|
||||
// Comment out the below line for success in later java such as java8_u172, works before u151 or so
|
||||
Endpoint.publish(String.format("http://%s:%d/hello2", "localhost", 0), new Ws());
|
||||
|
||||
int port = connector.getLocalPort();
|
||||
|
||||
System.out.printf("Started, check: http://localhost:%d/hello?wsdl%n", port);
|
||||
}
|
||||
|
||||
|
||||
@WebService
|
||||
public static class Ws {
|
||||
@WebMethod
|
||||
public String hello() {
|
||||
return "Hello";
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue