-
Bug
-
Resolution: Fixed
-
P3
-
11, 14
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8268758 | 11.0.13-oracle | Kiran Sidhartha Ravikumar | P3 | Resolved | Fixed | b01 |
JDK-8265508 | 11.0.12 | Julia Boes | P3 | Resolved | Fixed | b01 |
ADDITIONAL SYSTEM INFORMATION :
Microsoft Windows 10 Enterprise (Version: 10.0.16299 Build 16299)
OpenJDK Runtime Environment (build 14-ea+17-721)
A DESCRIPTION OF THE PROBLEM :
When calling HttpServer.stop( int delay ) on the dispatch thread of the HTTP server, the method call blocks indefinitely, and does not return after approximately <delay> seconds (as per Javadoc).
REGRESSION : Last worked in version 8
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1) Compile and start the attached application.
2) Open the URL "http://localhost:8889/context" in your browser (on the same machine on which you have started your application).
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The HTTP server is shut down, and "HTTP server stopped" is printed on System.out.
ACTUAL -
The dispatch thread blocks indefinitely:
Thread [HTTP-Dispatcher] (id=23)
waiting for: Thread (id=23)
Object.wait(long) line: not available [native method]
Thread.join(long) line: 1303
Thread.join() line: 1371
ServerImpl.stop(int) line: 215
HttpServerImpl.stop(int) line: 70
HttpServerTest.handle(HttpExchange) line: 38
Filter$Chain.doFilter(HttpExchange) line: 77
AuthFilter.doFilter(HttpExchange, Filter$Chain) line: 82
Filter$Chain.doFilter(HttpExchange) line: 80
ServerImpl$Exchange$LinkHandler.handle(HttpExchange) line: 692
Filter$Chain.doFilter(HttpExchange) line: 77
ServerImpl$Exchange.run() line: 664
ServerImpl$DefaultExecutor.execute(Runnable) line: 159
ServerImpl$Dispatcher.handle(SocketChannel, HttpConnection) line: 442
ServerImpl$Dispatcher.run() line: 408
Thread.run() line: 830
---------- BEGIN SOURCE ----------
package com.test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class HttpServerTest implements HttpHandler
{
private static final int HTTP_STATUS_CODE_OK = 200;
private final HttpServer server;
public HttpServerTest( HttpServer server )
{
this.server = server;
}
public static void main( String[] args ) throws IOException
{
HttpServer server = HttpServer.create( new InetSocketAddress( 8889 ), 0 );
server.createContext( "/context", new HttpServerTest( server ) ); //$NON-NLS-1$
server.start();
}
@Override
public void handle( HttpExchange exchange ) throws IOException
{
System.out.println( "Stopping HTTP server..." ); //$NON-NLS-1$
// Send response prior to executing, as the server shuts down and the response would not be emitted otherwise
sendHttpStatusCode( HTTP_STATUS_CODE_OK, exchange );
server.stop( 1 );
System.out.println( "HTTP server stopped" ); //$NON-NLS-1$
}
private void sendHttpStatusCode( int httpCode, HttpExchange arg )
{
try
{
arg.sendResponseHeaders( httpCode, 0 );
OutputStream out = arg.getResponseBody();
out.close();
}
catch ( IOException e )
{
e.printStackTrace( System.err );
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Calling HttpServer.stop() on a different thread
FREQUENCY : always
Microsoft Windows 10 Enterprise (Version: 10.0.16299 Build 16299)
OpenJDK Runtime Environment (build 14-ea+17-721)
A DESCRIPTION OF THE PROBLEM :
When calling HttpServer.stop( int delay ) on the dispatch thread of the HTTP server, the method call blocks indefinitely, and does not return after approximately <delay> seconds (as per Javadoc).
REGRESSION : Last worked in version 8
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1) Compile and start the attached application.
2) Open the URL "http://localhost:8889/context" in your browser (on the same machine on which you have started your application).
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The HTTP server is shut down, and "HTTP server stopped" is printed on System.out.
ACTUAL -
The dispatch thread blocks indefinitely:
Thread [HTTP-Dispatcher] (id=23)
waiting for: Thread (id=23)
Object.wait(long) line: not available [native method]
Thread.join(long) line: 1303
Thread.join() line: 1371
ServerImpl.stop(int) line: 215
HttpServerImpl.stop(int) line: 70
HttpServerTest.handle(HttpExchange) line: 38
Filter$Chain.doFilter(HttpExchange) line: 77
AuthFilter.doFilter(HttpExchange, Filter$Chain) line: 82
Filter$Chain.doFilter(HttpExchange) line: 80
ServerImpl$Exchange$LinkHandler.handle(HttpExchange) line: 692
Filter$Chain.doFilter(HttpExchange) line: 77
ServerImpl$Exchange.run() line: 664
ServerImpl$DefaultExecutor.execute(Runnable) line: 159
ServerImpl$Dispatcher.handle(SocketChannel, HttpConnection) line: 442
ServerImpl$Dispatcher.run() line: 408
Thread.run() line: 830
---------- BEGIN SOURCE ----------
package com.test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class HttpServerTest implements HttpHandler
{
private static final int HTTP_STATUS_CODE_OK = 200;
private final HttpServer server;
public HttpServerTest( HttpServer server )
{
this.server = server;
}
public static void main( String[] args ) throws IOException
{
HttpServer server = HttpServer.create( new InetSocketAddress( 8889 ), 0 );
server.createContext( "/context", new HttpServerTest( server ) ); //$NON-NLS-1$
server.start();
}
@Override
public void handle( HttpExchange exchange ) throws IOException
{
System.out.println( "Stopping HTTP server..." ); //$NON-NLS-1$
// Send response prior to executing, as the server shuts down and the response would not be emitted otherwise
sendHttpStatusCode( HTTP_STATUS_CODE_OK, exchange );
server.stop( 1 );
System.out.println( "HTTP server stopped" ); //$NON-NLS-1$
}
private void sendHttpStatusCode( int httpCode, HttpExchange arg )
{
try
{
arg.sendResponseHeaders( httpCode, 0 );
OutputStream out = arg.getResponseBody();
out.close();
}
catch ( IOException e )
{
e.printStackTrace( System.err );
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Calling HttpServer.stop() on a different thread
FREQUENCY : always
- backported by
-
JDK-8265508 HttpServer.stop() blocks indefinitely when called on dispatch thread
- Resolved
-
JDK-8268758 HttpServer.stop() blocks indefinitely when called on dispatch thread
- Resolved