IDEA报错:Address localhost:1099 is already in use 解决方案

1、问题描述

IDEA在运行项目,停止后,再次运行经常出现:

Error running 'Tomcat 8.5.82': Unable to open debugger port (127.0.0.1:9823): java.net.SocketException "Socket closed"
Error running 'Tomcat 8.5.82': Address localhost:1099 is already in use

尝试通过命令查看端口并没有被占用,按照网上处理类似问题无法kill相关进程。

2、问题发现

仔细观看Stop Tomcat按钮按下后的日志,可以发现:

12-Oct-2022 14:16:21.764 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[web]似乎启动了一个名为[DefaultQuartzScheduler_QuartzSchedulerThread]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
2022-10-12 14:16:44.674 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread:276 - batch acquisition of 0 triggers
2022-10-12 14:16:44.674 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread:276 - batch acquisition of 0 triggers
...

从上面可以知道,在发出Stop命令后,DefaultQuartzScheduler_QuartzSchedulerThread线程未能被停止,导致一直占用相关端口。此时Stop Tomcat按钮依旧可以点击,但是点击后并不会结束该进程!!!

仔细看了项目代码,发现是与quartz定时任务有关;其他类似关闭不了的问题相信绝大部分都是某个线程无法被关闭导致的问题,需要具体项目具体分析。

3、 问题处理

通过重写ServletContextListenercontextDestroyed()方法,在上下文销毁时,停止相关线程。

@WebListener
public class QuartzListener implements ServletContextListener {
    private final static Logger LOGGER = LoggerFactory.getLogger(QuartzListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        LOGGER.error("执行contextDestroyed。。。");
      	//停止相关线程
        QuartzManager.shutdownJobs();
    }
}

如果是老项目,@WebListener注解无法使用,可以在web.xml中手动添加监听器:

<listener>
  <listener-class>xxx.xxx.xxx.QuartzListener</listener-class>
</listener>

4、 测试

正常启动后,点击Stop Tomcat按钮后,日志如下:

2022-10-12 14:37:42.278 [main] ERROR c.c.b.core.listener.QuartzListener:43 - 执行contextDestroyed。。。
2022-10-12 14:37:42.652 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool:612 - WorkerThread is shut down.
...
2022-10-12 14:37:43.594 [main] INFO  o.s.s.c.ThreadPoolTaskScheduler:191 - Shutting down ExecutorService 'myScheduler'

再次启动,正常启动。✅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当你在IDEA中运行Tomcat时,出现"Address localhost:1099 is already in use"的错误,这意味着端口1099已经被占用了。为了解决这个问题,你可以尝试以下方法。首先,你可以使用命令行工具来查找并杀死占用1099端口的进程。在Windows系统中,你可以使用命令"netstat -ano | findstr :1099"来查找占用1099端口的进程ID,然后使用"taskkill /PID <进程ID> /F"来杀死该进程。在Mac或Linux系统中,你可以使用命令"lsof -i :1099"来查找占用1099端口的进程ID,然后使用"kill -9 <进程ID>"来杀死该进程。如果你无法找到占用1099端口的进程,或者杀死进程后问题仍然存在,你可以尝试修改Tomcat的配置文件,将其绑定到一个未被占用的端口。你可以编辑Tomcat的server.xml文件,找到以下行:<Connector port="1099" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />将其中的port属性值修改为一个未被占用的端口,保存文件后重新启动Tomcat即可。希望这些方法能够帮助你解决问题。\[1\] #### 引用[.reference_title] - *1* [Tomcat服务器启动Bug:Error running ‘Tomcat 9.0.37‘: Address localhost:1099 is already in use](https://blog.csdn.net/m0_56352213/article/details/124713848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值