记一次:springboot项目正常启动运行,但端口监听不到 的事件与解决方案

问题展示及查找解决过程:
1.springboot项目正常启动,但是内网接口无法访问,使用telnet之后发现端口不通,因为其他项目的端口都可以,所以排除了防火墙问题;
2.换了几个端口之后都不行,说明是项目本身的问题;
3.依次排除项目依赖及引用第三方的服务,发现是在使用阿里云datahub大数据“数据订阅”服务的时候导致端口无法监听;
4.先提供一个正常的springboot启动日志,注意正常情况下,spring容器初始化开始有个Tomcat initialized with port(s)容器初始化结束有个Tomcat started on port(s),且注意各个服务的启动顺序:

"C:\Program Files (x86)\Java\jdk1.8.0_73\bin\java.exe"···
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.22.RELEASE)

2020-12-11 09:37:40.207 [main] INFO  com.myTest.datahub.DataHubApplication {StartupInfoLogger.java:48} -Starting DataHubApplication on DESKTOP-BLJNOMK with PID 34468 (D:\workspace\myself\datahub\target\classes started by Administrator in D:\workspace\myself\datahub)
2020-12-11 09:37:40.209 [main] INFO  com.myTest.datahub.DataHubApplication {SpringApplication.java:574} -The following profiles are active: dev
2020-12-11 09:37:40.232 [main] INFO  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext {AbstractApplicationContext.java:583} -Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@11de4c7: startup date [Fri Dec 11 09:37:40 CST 2020]; root of context hierarchy
2020-12-11 09:37:40.309 [background-preinit] INFO  org.hibernate.validator.internal.util.Version {Version.java:30} -HV000001: Hibernate Validator 5.3.6.Final
2020-12-11 09:37:40.528 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate {RepositoryConfigurationDelegate.java:165} -Multiple Spring Data modules found, entering strict repository configuration mode!
2020-12-11 09:37:40.539 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate {RepositoryConfigurationDelegate.java:165} -Multiple Spring Data modules found, entering strict repository configuration mode!
2020-12-11 09:37:40.873 [main] INFO  o.s.b.c.e.tomcat.TomcatEmbeddedServletContainer {TomcatEmbeddedServletContainer.java:91} -Tomcat initialized with port(s): 9000 (http)
2020-12-11 09:37:40.879 [main] INFO  org.apache.coyote.http11.Http11NioProtocol {DirectJDKLog.java:180} -Initializing ProtocolHandler ["http-nio-9000"]
2020-12-11 09:37:40.889 [main] INFO  org.apache.catalina.core.StandardService {DirectJDKLog.java:180} -Starting service [Tomcat]
2020-12-11 09:37:40.889 [main] INFO  org.apache.catalina.core.StandardEngine {DirectJDKLog.java:180} -Starting Servlet Engine: Apache Tomcat/8.5.43
2020-12-11 09:37:40.967 [localhost-startStop-1] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] {DirectJDKLog.java:180} -Initializing Spring embedded WebApplicationContext
2020-12-11 09:37:40.967 [localhost-startStop-1] INFO  org.springframework.web.context.ContextLoader {EmbeddedWebApplicationContext.java:271} -Root WebApplicationContext: initialization completed in 735 ms
2020-12-11 09:37:41.050 [localhost-startStop-1] INFO  o.s.boot.web.servlet.ServletRegistrationBean {ServletRegistrationBean.java:190} -Mapping servlet: 'dispatcherServlet' to [/]
2020-12-11 09:37:41.052 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'characterEncodingFilter' to: [/*]
2020-12-11 09:37:41.053 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2020-12-11 09:37:41.053 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'httpPutFormContentFilter' to: [/*]
2020-12-11 09:37:41.053 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'requestContextFilter' to: [/*]
2020-12-11 09:37:41.702 [main] INFO  com.myTest.datahub.configuration.RedisConfig {RedisConfig.java:59} -单机Redis主机:localhost,端口:6379,密码:myTestRedis,数据库:15
2020-12-11 09:37:41.920 [main] INFO  o.s.w.s.m.m.a.RequestMappingHandlerAdapter {RequestMappingHandlerAdapter.java:557} -Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@11de4c7: startup date [Fri Dec 11 09:37:40 CST 2020]; root of context hierarchy
2020-12-11 09:37:41.950 [main] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping {AbstractHandlerMethodMapping.java:544} -Mapped "{[/dataHub/queryByBerthId/{berthId}],methods=[GET]}" onto public com.alibaba.fastjson.JSONObject com.myTest.datahub.controller.DataHubController.getBerthInfo(java.lang.String)
2020-12-11 09:37:41.951 [main] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping {AbstractHandlerMethodMapping.java:544} -Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-12-11 09:37:41.951 [main] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping {AbstractHandlerMethodMapping.java:544} -Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-12-11 09:37:41.964 [main] INFO  o.s.web.servlet.handler.SimpleUrlHandlerMapping {AbstractUrlHandlerMapping.java:364} -Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-12-11 09:37:41.964 [main] INFO  o.s.web.servlet.handler.SimpleUrlHandlerMapping {AbstractUrlHandlerMapping.java:364} -Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-12-11 09:37:41.982 [main] INFO  o.s.web.servlet.handler.SimpleUrlHandlerMapping {AbstractUrlHandlerMapping.java:364} -Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-12-11 09:37:42.104 [main] INFO  o.s.jmx.export.annotation.AnnotationMBeanExporter {MBeanExporter.java:431} -Registering beans for JMX exposure on startup
2020-12-11 09:37:42.110 [main] INFO  org.apache.coyote.http11.Http11NioProtocol {DirectJDKLog.java:180} -Starting ProtocolHandler ["http-nio-9000"]
2020-12-11 09:37:42.116 [main] INFO  org.apache.tomcat.util.net.NioSelectorPool {DirectJDKLog.java:180} -Using a shared selector for servlet write/read
2020-12-11 09:37:42.123 [main] INFO  o.s.b.c.e.tomcat.TomcatEmbeddedServletContainer {TomcatEmbeddedServletContainer.java:210} -Tomcat started on port(s): 9000 (http)
2020-12-11 09:37:42.125 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:75} -##########################start 这里是datahub订阅逻辑,自启动;在端口服务启动之后启动,端口就可以监听 ##########################
2020-12-11 09:37:42.125 [main] INFO  com.myTest.datahub.DataHubApplication {StartupInfoLogger.java:57} -Started DataHubApplication in 2.112 seconds (JVM running for 2.543)
2020-12-11 09:37:42.223 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:124} -接收到订阅数据:
2020-12-11 09:37:42.341 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:124} -接收到订阅数据:

再提供现在端口无法监听的异常启动日志:

"C:\Program Files (x86)\Java\jdk1.8.0_73\bin\java.exe" ···
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.22.RELEASE)

2020-12-11 10:20:23.613 [main] INFO  com.myTest.datahub.DataHubApplication {StartupInfoLogger.java:48} -Starting DataHubApplication on DESKTOP-BLJNOMK with PID 54196 (D:\workspace\myself\datahub\target\classes started by Administrator in D:\workspace\myself\datahub)
2020-12-11 10:20:23.615 [main] INFO  com.myTest.datahub.DataHubApplication {SpringApplication.java:574} -The following profiles are active: dev-bj
2020-12-11 10:20:23.638 [main] INFO  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext {AbstractApplicationContext.java:583} -Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@11de4c7: startup date [Fri Dec 11 10:20:23 CST 2020]; root of context hierarchy
2020-12-11 10:20:23.717 [background-preinit] INFO  org.hibernate.validator.internal.util.Version {Version.java:30} -HV000001: Hibernate Validator 5.3.6.Final
2020-12-11 10:20:23.947 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate {RepositoryConfigurationDelegate.java:165} -Multiple Spring Data modules found, entering strict repository configuration mode!
2020-12-11 10:20:23.959 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate {RepositoryConfigurationDelegate.java:165} -Multiple Spring Data modules found, entering strict repository configuration mode!
2020-12-11 10:20:24.313 [main] INFO  o.s.b.c.e.tomcat.TomcatEmbeddedServletContainer {TomcatEmbeddedServletContainer.java:91} -Tomcat initialized with port(s): 9000 (http)
2020-12-11 10:20:24.320 [main] INFO  org.apache.coyote.http11.Http11NioProtocol {DirectJDKLog.java:180} -Initializing ProtocolHandler ["http-nio-9000"]
2020-12-11 10:20:24.328 [main] INFO  org.apache.catalina.core.StandardService {DirectJDKLog.java:180} -Starting service [Tomcat]
2020-12-11 10:20:24.328 [main] INFO  org.apache.catalina.core.StandardEngine {DirectJDKLog.java:180} -Starting Servlet Engine: Apache Tomcat/8.5.43
2020-12-11 10:20:24.411 [localhost-startStop-1] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] {DirectJDKLog.java:180} -Initializing Spring embedded WebApplicationContext
2020-12-11 10:20:24.412 [localhost-startStop-1] INFO  org.springframework.web.context.ContextLoader {EmbeddedWebApplicationContext.java:271} -Root WebApplicationContext: initialization completed in 774 ms
2020-12-11 10:20:24.494 [localhost-startStop-1] INFO  o.s.boot.web.servlet.ServletRegistrationBean {ServletRegistrationBean.java:190} -Mapping servlet: 'dispatcherServlet' to [/]
2020-12-11 10:20:24.496 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'characterEncodingFilter' to: [/*]
2020-12-11 10:20:24.496 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2020-12-11 10:20:24.496 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'httpPutFormContentFilter' to: [/*]
2020-12-11 10:20:24.497 [localhost-startStop-1] INFO  o.s.boot.web.servlet.FilterRegistrationBean {AbstractFilterRegistrationBean.java:251} -Mapping filter: 'requestContextFilter' to: [/*]
2020-12-11 10:20:25.141 [main] INFO  com.myTest.datahub.configuration.RedisConfig {RedisConfig.java:59} -单机Redis主机:localhost,端口:6379,密码:myTestRedis,数据库:15
2020-12-11 10:20:25.167 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:79} -##########################start 这里就进入datahub订阅,陷入到循环之中,后面的spring容器初始化就无法彻底结束,Tomcat端口也就无法监听成功 ##########################
2020-12-11 10:20:25.648 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:124} -接收到订阅数据:
2020-12-11 10:20:25.944 [main] INFO  DatahubConsumerSub {DatahubConsumerSub.java:124} -接收到订阅数据:

,发现启动日志的后面没有了Tomcat started on port(s),说明容器初始化并没有完成,可能陷入到了datahub业务逻辑的循环之中,不向后面进行!

5.于是先到阿里云datahub官网和百度查看相关问题,没有找到有端口监听不到的相关记录。那就真的可能是它的启动顺序造成了spring容器初始化不能正常结束,无法将Tomcat端口正常启动和监听!
6.于是乎,看了下使用datahub服务的类,是个自启动类,类上引用@Configuration注解,方法使用了@PostConstruct(这个注解才是导致端口无法监听的关键!)。
查询@PostConstruct的定义:是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
注意:它是在spring容器初始化的时候执行的!因此,它的数据订阅服务的死循环很有可能导致spring容器无法初始化完成。要想解决这个问题,就需要让datahub服务在spring容器初始化完成之后引用才行,这个时候,就该ApplicationRunner粉墨登场了!
7.在SpringBoot中,提供了一个接口:ApplicationRunner。
该接口中,只有一个run方法,它执行的时机是:spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。
8.迫不及待的修改了datahub服务自启动的方式,让业务类去实现ApplicationRunner接口,在run方法中实现具体业务逻辑。
打包部署之后,使用linux命令:netstat -tunlp |grep 端口号  ,duang~~成功监听到项目端口号,接口也调用成功!

 

后记:后来意识到当前业务类因为循环的原因,没有走到代码逻辑的最后一步,所以尝试将业务封装在一个线程new Thread()中执行,这样原来的类就可以在@PostConstruct下执行完结,spring容器也初始化完成了!测试也成功了!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值