簡體   English   中英

Spring Boot:如何在運行時獲取tomcat端口?

[英]Spring Boot: How do get tomcat port at runtime?

我正在嘗試使用Netflix OSS來實現微服務架構。 我想在運行時bootstrap.yml文件中記錄server.port ,以查看哪個實例正在為請求提供服務。

我正在使用Java8。

重要的庫版本是:
* spring-boot-starter-web-1.5.8
* spring-boot-starter-tomcat-1.5.8
* tomcat-embed-core-8.5.23

瀏覽關於計算器后,我發現這個這個 ,但這些解決方案沒有奏效。

我的bootstrap.yml看起來像這樣:

spring:
  application:
    name: some-service

server:
  port: ${port:8088}

我試過以下代碼:

@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {

    private static Logger logger  = LoggerFactory.getLogger(SomeService .class);

    @LocalServerPort
    private static int randomServerPort;

    @LocalManagementPort
    private static int randomManagementPort;

    @Autowired
    private static Environment environment;

    @Value("${server.port}")
    // @Value("${local.server.port}")
    private static int port;

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

        logger.info("randomServerPort : {}", randomServerPort);
        logger.info("randomManagementPort : {}", randomManagementPort);
        logger.info("server.port : {}", port);
        logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));

}

相應的輸出是:

randomServerPort : 0
randomManagementPort : 0
server.port : 0
java.lang.NullPointerException against environment.getProperty("server.port")

前三個日志語句記錄0 ,而最后一個記錄拋出一個`NullPointerException *。

在運行時,端口將在控制台上的日志中打印為:

s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8088 (http)

我想在SomeService類的main方法中訪問此端口號。 我怎樣才能做到這一點?

靜態字段不會在Spring中注入。
您需要做的是首先將它作為實例字段。
然后,只有在Spring Boot容器初始化之后才能使用它。
在使用@PostConstruct注釋的方法中移動它們應該完成工作,因為在執行依賴項注入之后調用它。

@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {

    private static Logger logger  = LoggerFactory.getLogger(SomeService .class);

    @LocalServerPort
    private static int randomServerPort;

    @LocalManagementPort
    private static int randomManagementPort;

    @Autowired
    private static Environment environment;

    @Value("${server.port}")
    private int port;

    @PostConstruct
    public void postConstruct(){
        logger.info("randomServerPort : {}", randomServerPort);
        logger.info("randomManagementPort : {}", randomManagementPort);
        logger.info("server.port : {}", port);
        logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
    }    

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

}

您正在嘗試在Spring創建上下文之前訪問上下文信息。 刪除靜態引用,並從@PostConstruct塊而不是main訪問數據:

@Autowired
private Environment environment;

@Value("${server.port}")
private int port;

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

@PostConstruct
public void init() {
    logger.info("server.port : {}", port);
    logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
}

將服務器端口配置從bootstrap.yml移動到application.yml

application.yml

server:
  port: 8088

通常,bootstrap.yml包含兩個屬性:配置服務器的位置(spring.cloud.config.uri)和應用程序的名稱(spring.application.name)。 啟動時,Spring Cloud使用應用程序的名稱對配置服務器進行HTTP調用,並檢索該應用程序的配置。 另一方面,application.yml包含標准的應用程序配置 - 通常是默認配置,因為在引導過程中檢索的任何配置都將覆蓋此處定義的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM