当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:如何添加tomcat连接器以绑定到控制器

徐晔
2023-03-14

在Spring Boot文档中,有一节描述了如何为tomcat启用多个连接器(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/reference/htmlsingle/#howto-在tomcat中启用多个连接器)。

但是有没有一种方法可以简单地将连接器添加到现有的连接器(web和管理连接器)?并将它们绑定到一些mvc控制器?我想做的是创建一些可以在不同端口上访问的web服务。

共有2个答案

蓝宜
2023-03-14

server.portmanagement.portmanagement.context-path属性(访问Actuatorendpoint的最后两个)可以设置为使嵌入式容器监听在不同的港口。

在这种情况下,最好在服务器以外的端口上侦听。端口管理。端口

@Configuration
public class EmbeddedTomcatConfiguration {

    @Value("${server.additionalPorts}")
    private String additionalPorts;

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        Connector[] additionalConnectors = this.additionalConnector();
        if (additionalConnectors != null && additionalConnectors.length > 0) {
            tomcat.addAdditionalTomcatConnectors(additionalConnectors);
        }
        return tomcat;
    }

    private Connector[] additionalConnector() {
        if (StringUtils.isBlank(this.additionalPorts)) {
            return null;
        }
        String[] ports = this.additionalPorts.split(",");
        List<Connector> result = new ArrayList<>();
        for (String port : ports) {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(Integer.valueOf(port));
            result.add(connector);
        }
        return result.toArray(new Connector[] {});
    }
}

应用yml

server:
  port: ${appPort:8800}
  additionalPorts: 8881,8882

应用JAVA

@SpringBootApplication
@ComponentScan(...)
@Import(EmbeddedTomcatConfiguration.class)
public Application {

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

在里面http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html 我介绍了如何使嵌入式Tomcat在不同的端口上侦听,并将JavaMelody配置为通过新端口以独占方式访问它。

於乐语
2023-03-14

您可以为每个服务使用一个子应用程序,每个子应用程序通过设置其server.port属性来配置为使用单独的端口。您想要隔离的任何组件都应该放在其中一个子组件中。您想要共享的任何组件都应该放在父级中。

下面是这种方法的一个例子。有两个子应用程序,一个在端口8080上侦听,另一个在端口8081上侦听。每个包含一个控制器,分别映射到/one/two

package com.example;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

public class Application {

    public static void main(String[] args) {
        SpringApplicationBuilder parentBuilder 
                = new SpringApplicationBuilder(ApplicationConfiguration.class);
        parentBuilder.child(ServiceOneConfiguration.class)
                .properties("server.port:8080").run(args);
        parentBuilder.child(ServiceTwoConfiguration.class)
                .properties("server.port:8081").run(args);      
    }

    @Configuration
    static class ApplicationConfiguration {

        @Bean
        public MySharedService sharedService() {
            return new MySharedService();

        }   
    }

    @Configuration
    @EnableAutoConfiguration
    static class ServiceOneConfiguration {

        @Bean
        public ControllerOne controller(MySharedService service) {
            return new ControllerOne(service);
        }
    }

    @Configuration
    @EnableAutoConfiguration
    static class ServiceTwoConfiguration {

        @Bean
        public ControllerTwo controller(MySharedService service) {
            return new ControllerTwo(service);
        }
    }

    @RequestMapping("/one")
    static class ControllerOne {

        private final MySharedService service;

        public ControllerOne(MySharedService service) {
            this.service = service;
        }

        @RequestMapping
        @ResponseBody
        public String getMessage() {
            return "ControllerOne says \"" + this.service.getMessage() + "\"";
        }
    }

    @RequestMapping("/two")
    static class ControllerTwo {

        private final MySharedService service;

        public ControllerTwo(MySharedService service) {
            this.service = service;
        }

        @RequestMapping
        @ResponseBody
        public String getMessage() {
            return "ControllerTwo says \"" + this.service.getMessage() + "\"";
        }
    }

   static class MySharedService {

        public String getMessage() {
            return "Hello";
        }
    }
}
 类似资料:
  • 问题内容: 我刚开始使用angularJS,并努力为我要做的事情找出合适的架构。我只有一个页面应用程序,但 URL始终应该保持不变 ;我不希望用户能够导航到根以外的任何路由。在我的应用中,有一个主要的div需要承载不同的视图。访问新视图时,我希望它接管主div中的显示。以这种方式加载的视图可以被丢弃或停留在DOM中,就像隐藏在DOM中一样- 我很想知道每个视图如何工作。 我提出了一个我想做的粗略的

  • 我需要让我的Spring Boot应用程序在新端口上动态启动/停止侦听。我知道为此需要在Spring环境中注入一个新的tomcat连接器。 我能够使用ServletWebServerFactory和tomcatConnectorCustomizer添加连接器。但是这个bean只在Spring启动时加载。 有没有办法在运行时添加tomcat连接器?比如说方法调用? 我设法在运行时添加了一个Tomca

  • 向Postgres连接器中添加新表的步骤应该是什么?我的连接器正在跟踪两个表(表1和表2),我想添加另一个表(表3),它已经存在,并且在我的数据库中有数据。 这是我当前的配置: } 我试图修改连接器“table.include.list”并将“public.table3”添加到列表中,但它似乎没有触发此表的快照过程。 有什么想法吗?

  • 我有一个Debezium连接器,连接到SQL服务器,其中一个表在配置参数中。我想添加另一个表,我已经添加到参数中,尽管我的连接器没有接收到它。 我以前的看起来像这样: 我当前的如下所示: 我重启了Kafka,重启了Debezium中的连接器,但是当我查看bash中的连接器状态时,我仍然看到旧的值。是否需要做其他事情来让连接器刷新配置文件中的内容? Debezium版本:1.2.5。Kafka最终版

  • 大家下午好。我通常会自己发现并修正错误,但这次我真的卡住了。我的作业是写一个贷款计算器。所有代码都正常工作,编译也很好,直到我需要创建一个线图/图形,它弹出在一个新窗口中。 问题出在加载FXML文件或将其他控制器连接到主控制器的某个地方。 我尝试了不同的方法,并在不同的论坛上查看了解决方案,但无法在代码中实现。有人能给我提个解决办法吗? 提前感谢你的帮助。 P.S.这些是我试图寻找解决方案的链接,

  • 我需要在主控制器中绑定来自不同fxml的控件。我有3个fxml文件,分别名为MainView.fxml、ChildView1.fxml和ChildView2.fxml。 mainview.fxml ChildView1.fxml 默认情况下,从ChildView1Controller禁用button1。 我希望在我的另一个视图(ChildView2.fxml)中的表行被选中时启用它。同样,在取消选