我的 Spring Boot 应用程序非常小,只有一个工作:通过打开与第三方网站的 websocket 连接并监听消息来充当客户端。
问题是在我的javax.websocket.Endpoint实现初始化并创建连接之后,我的Spring引导应用程序关闭了。
我会认为任何开放的 websocket 连接都会让我的应用程序保持正常运行?
我不需要嵌入式 servlet 容器,所以我在 application.yaml 中专门设置了web-environment: false
。
有没有办法在不添加我永远不会使用的 servlet 容器的情况下解决这个问题?
我通过使用 OkHttpClient 并使用@Configuration
中的@PostConstruct
初始化它来解决此问题。我用@Component
注释了侦听器,它现在无需嵌入式 servlet 容器即可保持活动状态。
@PostConstruct
void handleRequest() {
Runnable runnable = () -> {
while (true) {
try {
JSONObject requestBody = getRequestBodyFromInput(serverSocket.accept());
requestHandler.handleRequest(requestBody);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
};
new Thread(runnable).start();
}
我在套接字继续侦听时启动了一个新线程,我不会通过在 while 循环中循环它来让新线程死亡。
你简直可以永远循环。
while (true) {}