有一个使用 HttpServer 的应用程序:
public class HttpServer {
private static final Logger log = Logger.getLogger(HttpServer.class);
private com.sun.net.httpserver.HttpServer server = null;
public void startHttpServer(int port) {
try {
server = com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(port), 0);
} catch (IOException e) {
log.error(e.getStackTrace());
}
System.out.println("HTTP server started at " + port);
server.createContext("/", new RootHandler());
server.createContext("/limit_objects", new GetLimitHandler());
server.createContext("/need_update_metadata", new PostUpdateMetadata());
server.createContext("/update_limit_objects", new PostUpdateLimitHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
}
}
class RootHandler implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
String response = "{\"Result\": \"I am working!\"}";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
class GetLimitHandler implements HttpHandler {
private static final Logger log = Logger.getLogger(GetLimitHandler.class);
@Override
public void handle(HttpExchange httpExchange) {
String response = limits.toString();
try {
httpExchange.sendResponseHeaders(200, limits.toString().length());
OutputStream outputStream = httpExchange.getResponseBody();
outputStream.write(response.getBytes());
outputStream.close();
} catch (IOException e) {
log.error(e.getStackTrace());
}
}
}
class PostUpdateMetadata implements HttpHandler {
private static final Logger log = Logger.getLogger(PostUpdateMetadata.class);
@Override
public void handle(HttpExchange he) {
String response = "{\"Result\": \"Metadata was update\"}";
SettingTopicProperties settingTopicProperties = new SettingTopicProperties();
settingTopicProperties.createZNode(needUpdateMetadata, "");
try {
he.sendResponseHeaders(200, response.length());
OutputStream outputStream = he.getResponseBody();
outputStream.write(response.getBytes());
outputStream.close();
} catch (IOException e) {
log.error(e.getStackTrace());
}
}
}
class PostUpdateLimitHandler implements HttpHandler {
private static final Logger log = Logger.getLogger(PostUpdateLimitHandler.class);
@Override
public void handle(HttpExchange he) {
InputStreamReader inputStreamReader = null;
try {
inputStreamReader = new InputStreamReader(he.getRequestBody(), "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String query = bufferedReader.readLine();
String response = "{\"Result\": \"Limit of objects was updated\"}";
SettingTopicProperties settingTopicProperties = new SettingTopicProperties();
settingTopicProperties.update(recordLimitProperties, query.getBytes());
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
} catch (IOException e) {
log.error(e.getStackTrace());
}
}
}
对服务器的所有请求都正常处理。但是应用程序在停止时会冻结。如果不向 HttpServer 发送请求,则正常停止。可能是什么问题呢?
问题原来不是在HttpServer,而是在Zookeeper,在联系HttpServer后挂了