经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
解决java启动时报线程占用报错:Exception?in?thread?“Thread-14“?java.net.BindException:?Address?already?in?use:?bind
来源:jb51  时间:2023/4/19 9:01:00  对本文有异议

前言

本文提供三种不同的解决方式,也是三种不同的情况和思路

我的问题是在springboot整合了xxl-job一段时间后出现的。如果你程序里集成了xxl-job或者有需要配置其它端口的地方,这篇文章或许可以给你带来启发或者解决你的问题。

1 异常

启动项目后抛出异常,但是奇怪的是执行器在任务调度中心中注册成功,也能成功执行

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  3. ' |____| .__|_| |_|_| |_\__, | / / / /
  4. =========|_|==============|___/=/_/_/_/
  5. :: Spring Boot :: (v2.2.2.RELEASE)
  6.  
  7. 2023-02-14 11:22:15.516 INFO 4436 --- [ main] com.jxj.SafetyWebserverApplication : Starting SafetyWebserverApplication on abc with PID 4436 (C:\project\safetyproduction_collectdata\target\classes started by whx in C:\project\safetyproduction_collectdata)
  8. 2023-02-14 11:22:15.521 INFO 4436 --- [ main] com.jxj.SafetyWebserverApplication : No active profile set, falling back to default profiles: default
  9. 2023-02-14 11:22:16.722 INFO 4436 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
  10. ....
  11.  
  12. 2023-02-14 11:22:19.191 INFO 4436 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
  13. 2023-02-14 11:22:19.394 INFO 4436 --- [ main] com.jxj.config.XxlJobConfig : >>>>>>>>>>> xxl-job config init.
  14. 2023-02-14 11:22:19.666 INFO 4436 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
  15. 2023-02-14 11:22:20.271 INFO 4436 --- [ main] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@c6bf8d9[class com.jxj.task.WarningTask#demoJobHandler]
  16. 2023-02-14 11:22:20.585 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
  17. 2023-02-14 11:22:20.586 INFO 4436 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application.errorChannel' has 1 subscriber(s).
  18. 2023-02-14 11:22:20.586 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean '_org.springframework.integration.errorLogger'
  19. 2023-02-14 11:22:20.586 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {message-handler:mqttPublisherConfig.mqttOutbound.serviceActivator} as a subscriber to the 'mqttOutboundChannel' channel
  20. 2023-02-14 11:22:20.586 INFO 4436 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.mqttOutboundChannel' has 1 subscriber(s).
  21. 2023-02-14 11:22:20.600 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean 'mqttPublisherConfig.mqttOutbound.serviceActivator'
  22. 2023-02-14 11:22:20.600 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {message-handler:mqttSenderConfig.mqttOutbound.serviceActivator} as a subscriber to the 'mqttOutboundChannel1' channel
  23. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.mqttOutboundChannel1' has 1 subscriber(s).
  24. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean 'mqttSenderConfig.mqttOutbound.serviceActivator'
  25. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {message-handler:mqttSubscriberConfig.handler.serviceActivator} as a subscriber to the 'mqttInboundChannel' channel
  26. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.mqttInboundChannel' has 1 subscriber(s).
  27. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean 'mqttSubscriberConfig.handler.serviceActivator'
  28. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] ProxyFactoryBean$MethodInvocationGateway : started bean 'mqttGateway'
  29. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] ProxyFactoryBean$MethodInvocationGateway : started bean 'mqttGateway'
  30. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] ProxyFactoryBean$MethodInvocationGateway : started bean 'mqttGateway'
  31. 2023-02-14 11:22:20.601 INFO 4436 --- [ main] o.s.i.gateway.GatewayProxyFactoryBean : started bean 'mqttGateway'
  32. Exception in thread "Thread-17" java.net.BindException: Address already in use: bind
  33. at sun.nio.ch.Net.bind0(Native Method)
  34. at sun.nio.ch.Net.bind(Net.java:433)
  35. at sun.nio.ch.Net.bind(Net.java:425)
  36. at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
  37. at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134)
  38. at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551)
  39. at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1346)
  40. at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503)
  41. at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488)
  42. at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:985)
  43. at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247)
  44. at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344)
  45. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
  46. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
  47. at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
  48. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
  49. at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050)
  50. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  51. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  52. at java.lang.Thread.run(Thread.java:748)
  53. 2023-02-14 11:22:21.444 INFO 4436 --- [ main] .m.i.MqttPahoMessageDrivenChannelAdapter : started bean 'inbound'; defined in: 'class path resource [com/jxj/config/MqttSubscriberConfig.class]'; from source: 'org.springframework.core.type.classreading.SimpleMethodMetadata@1d4664d7'
  54. 2023-02-14 11:22:21.446 INFO 4436 --- [ main] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]
  55. 2023-02-14 11:22:25.537 INFO 4436 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer : Broker not available; cannot force queue declarations during start: java.net.ConnectException: Connection refused: connect
  56. 2023-02-14 11:22:25.545 INFO 4436 --- [ntContainer#0-1] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]

2 问题定位

2.1 第一种情况

网上有的说通过

在低版本的 xxl-job 中, 初始化XxlJobSpringExecutor执行器需要在@Bean中加上 initMethod = "start", destroyMethod = "destroy",但是在高版本的 xxl-job(如 2.1.2)则需要删除 initMethod = "start", destroyMethod = "destroy"

而我的问题不是在bean上加(initMethod = “start”, destroyMethod = “destroy”),我加上之后会报两遍线程被使用的异常。

  1. Exception in thread "Thread-14" java.net.BindException: Address already in use: bind
  2. at sun.nio.ch.Net.bind0(Native Method)
  3. at sun.nio.ch.Net.bind(Net.java:433)
  4. at sun.nio.ch.Net.bind(Net.java:425)
  5. at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
  6. at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134)
  7. at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551)
  8. at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1346)
  9. at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503)
  10. at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488)
  11. at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:985)
  12. at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247)
  13. at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344)
  14. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
  15. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
  16. at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
  17. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
  18. at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050)
  19. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  20. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  21. at java.lang.Thread.run(Thread.java:748)
  22. 2023-02-14 11:25:20.568 INFO 18140 --- [ main] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@1618c98a[class com.jxj.task.WarningTask#demoJobHandler]
  23. Exception in thread "Thread-20" java.net.BindException: Address already in use: bind
  24. at sun.nio.ch.Net.bind0(Native Method)
  25. at sun.nio.ch.Net.bind(Net.java:433)
  26. at sun.nio.ch.Net.bind(Net.java:425)
  27. at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
  28. at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134)
  29. at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551)
  30. at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1346)
  31. at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503)
  32. at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488)
  33. at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:985)
  34. at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247)
  35. at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344)
  36. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
  37. at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
  38. at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
  39. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
  40. at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050)
  41. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
  42. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
  43. at java.lang.Thread.run(Thread.java:748)
  1. //原注解:
  2. @Bean
  3. public XxlJobSpringExecutor xxlJobExecutor() {
  4. ...
  5. }
  6. //修改后注解
  7. @Bean(initMethod = "start", destroyMethod = "destroy")
  8. public XxlJobSpringExecutor xxlJobExecutor() {
  9. ...
  10. }

2.2 第二种情况

后来我发现我的问题是 本地和线上的程序连接了相同的xxl-job,并且连接xxl-job的端口是一样的,导致了这个问题!

  1. xxl:
  2. job:
  3. accessToken: xxx
  4. admin:
  5. # addresses: http://1xxxxx/xxl-job-admin
  6. addresses: http://39xxxxx/xxl-job-admin
  7. executor:
  8. address: 'xxx'
  9. appname: safexxxxxst #这个名字要和页面配置的一致
  10. ip: ''
  11. logpath: /datxxxxjob/joxxxler
  12. logretentiondays: 30
  13. port: 9996

就是这个 port端口重复导致的问题修改一下即可

port: 9996

2.3 第三种情况

本来我是第二种情况已经解决了,结果下午又报这个错了,因此有了第三种情况的解决。

启动报错时的 错误关键日志:

  1. 2023-02-14 13:59:12.074 INFO 8364 --- [ main] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#131ba005:0/SimpleConnection@5981f2c6 [delegate=amqp://root@127.0.0.1:5673/, localPort= 5415]
  2. Exception in thread "Thread-21" java.net.BindException: Address already in use: bind
  3. at sun.nio.ch.Net.bind0(Native Method)
  4. at sun.nio.ch.Net.bind(Net.java:433)
  5. at sun.nio.ch.Net.bind(Net.java:425)
  6. at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
  7. at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134)
  8. at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551)
  9. at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1346)
  10. at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503)
  11. at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488)
  12. at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:985)
  13. at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247)
  14. at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344)
  15. at

由于我已经解决过一次,所以我对端口比较敏感(大家看完后面的分析就可以知道我为什么敏感),就在yaml文件种搜了一下所有的 port 一共有五处。

排除项目的port(项目的接口冲突会直接报错,停止运行

排除xxl-job (第二种情况冲突已经解决

剩下的是集成的 redis,elasticsearch,rabbitmq

redis和elasticsearch我都没有开启,问题就只在rabbitmq了。

rabbitmq我是本地起的docker,来连接测试的。

然后我有认真看了一下日志,就是上面贴出来的第一行

[delegate=amqp://root@127.0.0.1:5673/, localPort= 5415]

也就是打印完这个日志后报的错误,localPort= 5415,于是我又在本地查看了一下这个5415端口使用情况

netstat -aon|findstr 5415

果然 两个不同的线程在用!

  1. C:\Uxxxs\1xx0>netstat -aon|findstr 5415
  2. TCP 127.0.0.1:5415 127.0.0.1:5673 ESTABLISHED 8364
  3. TCP 127.0.0.1:5673 127.0.0.1:5415 ESTABLISHED 4136

然后我打开任务管理器 详细信息,找到4136是daocker

我重启了一下电脑,,解决了

3 问题原因

程序启动之后重新启动了一个线程去连接xxl-job的端口,但是这个端口已经被占用了,所以程序就直接返回了一个这个线程被占用了。

4 思考学习

服务创建监听的时候,如果端口有LISTENING、ESTABLISHED、TIME_WAIT等,好像都会报错。 可以研究下原理

TCP状态转移要点

TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

1、LISTENING状态

  FTP服务启动后首先处于侦听(LISTENING)状态。

2、ESTABLISHED状态

  ESTABLISHED的意思是建立连接。表示两台机器正在通信。

3、TIME_WAIT

我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。

总结

到此这篇关于解决java启动时报线程占用:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bind的文章就介绍到这了,更多相关java启动时报线程占用内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号