Java创建/覆盖http服务器

Java创建/覆盖http服务器,java,rest,Java,Rest,我正在某个平台上创建一个插件(细节无关),需要创建一个HTTP端点。在正常情况下,您会创建一个http服务器,并在使用完它或应用程序停止时停止它,但是,在我的情况下,我无法检测插件何时被卸载/重新安装 问题 当有人安装我的插件两次时,第二次它会抛出一个错误,因为我试图在一个已经在使用的端口上创建一个http服务器。由于正在重新安装,我也无法将http服务器保存在某个静态变量上。换句话说,我需要能够停止以前创建的http服务器,而无需对其进行任何引用 我的尝试 我认为与http服务器的原始引用交互

我正在某个平台上创建一个插件(细节无关),需要创建一个HTTP端点。在正常情况下,您会创建一个http服务器,并在使用完它或应用程序停止时停止它,但是,在我的情况下,我无法检测插件何时被卸载/重新安装

问题

当有人安装我的插件两次时,第二次它会抛出一个错误,因为我试图在一个已经在使用的端口上创建一个http服务器。由于正在重新安装,我也无法将http服务器保存在某个静态变量上。换句话说,我需要能够停止以前创建的http服务器,而无需对其进行任何引用

我的尝试

我认为与http服务器的原始引用交互的唯一方法是在http服务器启动时创建一个线程,然后覆盖
interrupt()
方法以停止服务器,但不知何故,我仍然收到“端口已在使用”错误。我使用Undertow作为http服务器库,但这个问题适用于任何http服务器实现

导入io.undertow.undertow;
导入io.undertow.util.Headers;
公共类SomeServlet扩展线程{
私有静态最终字符串THREAD_NAME=“some-servlet-container-5391301”;
专用静态最终int端口=5839;
专用下拖服务器;
publicstaticvoidlisten(){//每当安装我的插件时,都会调用此方法
deleteExistingServer();
新建SomeServlet().start();
}
私有静态void deleteExistingServer(){
对于(线程t:Thread.getAllStackTraces().keySet()){
if(t.getName().equals(线程名称)){
t、 中断();
}
}
}
@凌驾
公开募捐{
createServer();
}
@凌驾
公共空间中断(){
试一试{
系统输出打印项次(“中断”);
this.server.stop();
}最后{
super.interrupt();
}
}
私有void createServer(){
this.server=Undertow.builder()
.addHttpListener(端口,“本地主机”)
.setHandler(交换->{
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE,“text/plain”);
exchange.getResponseSender().send(“你好,世界!”);
})
.build();
这是.server.start();
}
}
期望的行为


无论何时调用
listen()
,它都将删除任何以前存在的http服务器并创建一个新的http服务器,而不依赖于将服务器存储在静态变量上。

您可以尝试com.sun.net.httpserver.httpserver。用于停止和“”测试请求:

import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class TestHttpServer {
    public static void main(String[] args) throws IOException {
        final HttpServer server = HttpServer.create();
        server.bind(new InetSocketAddress(8765), 0);

        server.createContext("/test", httpExchange -> {
            String response = "<html>TEST!!!</html>";
            httpExchange.sendResponseHeaders(200, response.length());
            OutputStream os = httpExchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        });

        server.createContext("/stop", httpExchange -> server.stop(1));

        server.start();
    }
}
导入com.sun.net.httpserver.httpserver;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.net.InetSocketAddress;
公共类TestHttpServer{
公共静态void main(字符串[]args)引发IOException{
最终HttpServer服务器=HttpServer.create();
绑定(新的InetSocketAddress(8765),0);
server.createContext(“/test”,httpExchange->{
字符串响应=“测试!!!”;
httpExchange.sendResponseHeaders(200,response.length());
OutputStream os=httpExchange.GetResponseBy();
write(response.getBytes());
os.close();
});
server.createContext(“/stop”,httpExchange->server.stop(1));
server.start();
}
}

为停止请求创建端点,这肯定是我没有想到的。我将尝试实现类似的功能(具有更高的安全性以防止滥用)。为什么要重新启动它?在Java中,您可以使用反射动态加载代码,而无需重新启动任何东西。我的代码由我无法控制的第三方加载。