参考文章:

https://www.cnblogs.com/angryprogrammer/p/11757302.html
spring boot 不占用端口方式启动

spring boot 不占用端口方式启动

有时候一台机器上部署的项目多的时候,端口资源就比较紧张了,其实有的微服务组件仅仅只是提供RPC服务,可以不用占用web启动的端口,此时spring boot 不占用web端口的方式就派上用场了,但是spring boot 1.x与spring boot 2.x的配置是有区别的,在使用时一定要注意一下自己所使用的版本:

spirngboot 2.x之前(代码方式实现):

@SpringBootApplication
public class Application {

public static void main(String[] args) {
     new SpringApplicationBuilder().sources(Application.class).web(false).run(args);
  }
}

spinrboot 2.x之前(另外一种代码实现方式)

@Configuration
@EnableAutoConfiguration
public class MyClass{
    public static void main(String[] args) throws JAXBException {
          SpringApplication app = new SpringApplication(MyClass.class);
          app.setWebEnvironment(false);
          ConfigurableApplicationContext ctx = app.run(args);
     }
}

spinrboot 2.x之前(配置方式)

spring.main.web-environment=false

springboot 2.x之后(代码方式)

@SpringBootApplication
public class MyApplication {

public static void main(String[] args) {
      new SpringApplicationBuilder(MyApplication.class)
             .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
             .run(args);
       }
}

springboot 2.x之后(配置方式)

spring.main.web-application-type=none

不过这里有个点需要注意,如果配置成不占用端口的方式启动,若main方法执行完后,没其他的deamon线程在跑,应用就会自动关闭了,有些新同学最容易放这种错误,并且还不清楚错误在哪;

在使用阻塞线程时,这里也有个坑,有人使用System.in.read();进行阻塞,这种写法在window环境下是没问题的,但是在linux下会出现不阻塞的情况,具体可参考这篇文章:https://blog.csdn.net/zistrong/article/details/84758138

推荐写法:

/**
 * @Description: TODO
 * @Author Mr.huang
 * @Date 2019/10/28 0028
 * @Version V1.0
 **/
@SpringBootApplication
@EnableScheduling
public class GameDataServerApplication implements CommandLineRunner{
    private static final Logger logger = LoggerFactory.getLogger(GameDataServerApplication.class);
    public static void main(String[] args) {
       SpringApplication.run(GameDataServerApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {        //这里也可以添加一些业务处理方法,比如一些初始化参数等
        while(true){
            try {
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                logger.error("oi进程意外结束",e);
            }
        }
    }
}

spring-boot自定义启动端口

通过编码的方式来指定端口

https://www.cnblogs.com/yaomajor/p/8616929.html
spring-boot自定义启动端口

https://www.cnblogs.com/baby123/p/11381171.html
spring boot 指定启动端口

在启动类中添加servletContainer方法

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public TomcatServletWebServerFactory servletContainer(){
        return new TomcatServletWebServerFactory(8081) ;
    }

}

说明:

该代码适用于spring boot2X中

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐