Spring boot-创建Tomcat

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring boot-创建Tomcat相关的知识,希望对你有一定的参考价值。

参考技术A Spring boot实例化的context是一个AnnotationConfigServletWebServerApplicationContext对象,该类的类图如下:

从类图中可以知道,该类直接继承自ServletWebServerApplicationContext类,在Spring boot进入fresh阶段时,会执行到onRefresh方法,创建Tomcat实例就是在此业务逻辑中,onFresh方法有两个处理,1)初始化主题功能。2)创建Tomcat。

表示一个完全配置的web服务器(如:Tomcat,Jetty, Netty)的简单接口,允许服务器启动和停止,接口签名如下

该接口的实现类有JettyWebServer、NettyWebServer、TomcatWebServer、UndertowServletWebServer、UndertowWebServer。这里使用的是抽象工厂设计模式。

可用于创建WebServer的工厂接口,该接口的签名如下:

其实现类有ConfigurableServletWebServerFactory、JettyServletWebServerFactory、TomcatServletWebServerFactory、UndertowServletWebServerFactory、AbstractServletWebServerFactory。

servlet web服务器的配置类,它们应该是常规自动配置类中的@Import,以保证它们的执行顺序。

带有端点的 Spring Boot 创建了两个 Tomcat 容器

【中文标题】带有端点的 Spring Boot 创建了两个 Tomcat 容器【英文标题】:Spring boot with endpoints creates two Tomcat containers 【发布时间】:2015-02-18 22:52:22 【问题描述】:

我有一个带有以下配置的 spring-boot jar:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

      <dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-core</artifactId>
    <version>1.2.2</version>
  </dependency>
  <dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-client-javascript</artifactId>
    <version>1.2.2</version>
    <type>javascript</type>
  </dependency>

管理属性

info.app.name=MyApp
info.app.description="blah blah"
info.app.version=1.0.0
peg.sendInterval.millis=3600000
instance.name=Appster
jolokia.config.debug=true
endpoints.jolokia.enabled=true
endpoints.jolokia.path=jolokia
spring.jmx.enabled=true
endpoints.jmx.enabled=true
management.port=9001
management.address=<super-secret-ip>
security.user.name=admin
security.user.password=cracked

当我指定管理端口 (9001) 时,我会看到一个单独的 Tomcat 实例。除了 :9001 之外,还有一个默认的 Tomcat 实例在 8080 / localhost 上运行。如果我将管理端口指定为 8080,则不起作用。如何禁用在 8080 上运行的默认设置?

【问题讨论】:

您的目标是在不使用 HTTP 的应用程序中通过 HTTP 公开管理端点吗?或者,应该可以将两个端口配置为相同的值。你说“没有用”。你能扩展一下吗?你看到了什么失败?您是如何确定事情不正常的? application.properties 看起来像什么并指定了您希望 Spring Boot 嵌入式服务器使用的端口? 【参考方案1】:

设置 server.port=-1 将关闭主应用程序 Web 端点(根据 docs here)。

【讨论】:

谢谢戴夫。如您所述,这将禁用端点。但是,嵌入式 Tomcat 仍然被加载。是否有阻止加载默认嵌入式 Tomcat 的属性。我可以使用 JMX 停止并销毁它,但我确信必须有一些属性来防止加载。 您可以设置spring.main.webEnvironment=false(或使用SpringApplication中的setter)。是这个意思吗? 我正在将 Jolokia 用于 JMX-HTTP 桥接器,除了默认设置之外,它还生成了一个单独的嵌入式 Tomcat。我只想关闭默认设置,而不是第二个。您指定的选项似乎阻止加载两者。 如果您使用对 Jolokia 的 Spring Boot 支持,我认为它应该在主应用程序上下文中与 webEnvironment=false 一起使用。你在使用其他的 Jolokia 包装器吗? 我编辑了我的 OP,它现在显示了 maven pom.xml 的 Jolokia 特定部分。它似乎与 spring-boot 文档同步。

以上是关于Spring boot-创建Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 嵌入式 Tomcat 线程池创建开销

Spring Boot2.0之 原理—创建内置Tomcat容器

如何创建 Spring Boot 应用程序并在 Tomcat 中将其作为 .war 运行? [复制]

SPRING BOOT 手动 War 文件部署到 Tomcat 并重新启动服务器,不创建数据库

无法使用 Spring-Boot 创建多个数据源

Spring Boot启动过程:Spring Boot内嵌Tomcat启动