如何在JFinal项目启动完成之后启动Socket

tomcat8启动JFinal,将Socket放在onStart启动,因ServerSocket.accept()导致tomcat启动的不完成,导致项目无法正常关闭tomcat。请问在JFinal中如何正常启动Socket,或说JFinal是否有想spring一样的对Socket的项目集成

评论区

杜福忠

2020-09-21 09:39

onStart 的时候新开一个线程 new Thread 去启动你的Socket

渴死的鱼

2020-09-21 10:20

@杜福忠 谢谢,再开一个解决了。但是遇到个问题,ServerSocket.close()的时候会报错java.net.SocketException: socket closed,我把输入输出流也都是关闭了以后再ServerSocket.close()的

杜福忠

2020-09-21 11:05

@渴死的鱼 没见代码咋写的咋关闭的, 可以try catch 住 不让继续外抛 :)

渴死的鱼

2020-09-21 13:34

@杜福忠 一直往外抛其实并不能解决,虽然目前没有泄露溢出的情况,这个问题本质其实我是想问如何有效的ServerSocket.accept(),因为正常ServerSocket.close()容易报错,尝试了不少网上的方法,但好多都是避开,而正经的答案确也说的不详细

杜福忠

2020-09-21 22:11

@渴死的鱼 不是网友说的不详细,只是这个问题是一个运行状态提示罢了。
就像大家不会解释太多NullPointException咋处理一样,
因为创建ServerSocket对象的线程 和 操作关闭 一般写法不是同一个线程,所以循环调用serverSocket.accept()的时候,会提示Socket is closed
如果非得不让它提示,那么serverSocket.close()得由创建ServerSocket对象的那个线程来自己关闭,比如增加一个 自定义全局变量 来管理关闭状态,外部线程只标记关闭自定义那个状态,不做真正关闭操作。伪代码大致:
myClose = true;//比如在JFinalConfig 配置子类 的onStop()赋值
while (true) {
if(myClose){
serverSocket.close();
return;
}
//前面如果关闭了,代码就执行不到这里来,当不会提示了
socket = serverSocket.accept();
}
但是感觉不如加一个try catch来得方便,因为循环当中,本来大家都会写try catch所以更简单

李通

2020-09-23 08:20

@渴死的鱼 你搜索过我的这个帖子吗?
https://jfinal.com/share/2234

热门反馈

扫码入社