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

SpringBoot>在运行时以编程方式添加Jetty服务器连接器端口?

胡承载
2023-03-14

使用spring boot和jetty,我希望能够将我的应用程序配置为侦听其他端口,这些端口在运行时以编程方式添加(删除?)。

我试过的:

我遵循了本教程,它允许我在多个端口上侦听。这很好地工作,但不幸的是只在启动时工作。

我已经尝试了@Autowireaorg.eclipse.jetty.server.Server类到服务中,这样我就可以添加连接器-我得到了错误没有找到[org.eclipse.jetty.server.Server]类型的合格bean...

建筑gradle(依赖项

buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE")
    }
}

apply plugin: 'spring-boot'

...

compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-tomcat"
}
compile "org.springframework.boot:spring-boot-starter-jetty"
compile "org.eclipse.jetty:jetty-proxy:9.2.17.v20160517"

...

不确定从这里尝试什么。。。

共有1个答案

高砚
2023-03-14

您可以从Boot的JettyEmbeddedServletContainer获得Jetty服务器,该容器可从EmbeddedWebApplicationContext获得。一旦掌握了服务器,就可以使用Jetty的API向其添加新的连接器。

下面的示例添加了一个新连接器,以响应正在发布的ApplicationReadyEvent:

@Bean
public JettyCustomizer jettyCustomizer(EmbeddedWebApplicationContext context) {
    return new JettyCustomizer(
            (JettyEmbeddedServletContainer) context.getEmbeddedServletContainer());
}

static class JettyCustomizer implements ApplicationListener<ApplicationReadyEvent> {

    private final JettyEmbeddedServletContainer container;

    JettyCustomizer(JettyEmbeddedServletContainer container) {
        this.container = container;
    }

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        Server server = this.container.getServer();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8081);
        server.addConnector(connector);
        try {
            connector.start();
        }
        catch (Exception ex) {
            throw new IllegalStateException("Failed to start connector", ex);
        }
    }
}

您应该在日志中看到默认连接器从端口8080开始,然后第二个连接器从8081开始:

2016-08-16 10:28:57.476  INFO 71330 --- [           main] o.e.jetty.server.AbstractConnector       : Started ServerConnector@64bc21ac{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2016-08-16 10:28:57.478  INFO 71330 --- [           main] .s.b.c.e.j.JettyEmbeddedServletContainer : Jetty started on port(s) 8080 (http/1.1)
2016-08-16 10:28:57.482  INFO 71330 --- [           main] o.e.jetty.server.AbstractConnector       : Started ServerConnector@664a9613{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2016-08-16 10:28:57.483  INFO 71330 --- [           main] sample.jetty.SampleJettyApplication      : Started SampleJettyApplication in 1.838 seconds (JVM running for 2.132)
 类似资料:
  • 问题内容: 是否可以使用XML配置中的规范以编程方式添加Log4J2附加程序? 我计划在log4j2.xml中定义所有内容,然后按情况选择追加器(不会编译): 问题答案: 编辑:有关log4j2的最新版本,请参阅下方答案 我给他们留下了不希望您这样做的印象,但这对我有用:

  • 问题内容: 我正在将SSL客户端连接到我的SSL服务器。当客户端由于根密钥不存在而无法验证证书时,我需要选择将该证书添加到代码中的本地密钥存储中并继续。有一些示例始终接受所有证书,但是我希望用户验证证书并将其添加到本地密钥存储中,而无需离开应用程序。 关于自定义SocketFactory,TrustManager,SSLContext等的内容很多,我不太了解它们如何组合在一起,或者这将是我实现目标

  • 我的要求是,我使用jsplumb.addEndPoint为两个名为“container0”和“container1”的容器添加两个endpoint。 现在我需要通过编程方式使用连接器链接两个endpoint,但是jsplump.connect创建了一个新endpoint并进行连接,而不是使用我使用jsplump.addEndpoint创建的endpoint。 我如何连接这两个endpoint?此外

  • 我正在使用高级自定义字段(ACF ),并尝试以编程方式向现有组(group_5621b0871e1b1)添加一个中继器,但它不起作用。相同的代码适用于文本字段,但不适用于repeater。 在我的插件中: 它显示了group_5621b0871e1b1组中的此错误: 我做错什么了吗?有没有可能以编程方式添加一个中继器。

  • 我有一个JPA(Hibernate)项目,其中包含从XML orm.XML和Beans创建的实体,我有一个EntityManager和update、persist、remove、findById、findAll方法,但我需要添加一个过滤器监听器来检查保存、还原等之前和之后的Beans(我需要将一些值设置为null以返回客户机) 问候。

  • 我使用org.eclipse.jetty.server.handler.请求日志处理程序 但此处理程序日志仅: 0:0:0:0:0:0:0:1--[04/θών/2014:08:16:27 0000]“GET/CardTransfer-0.1.0-SNAPSHOT/transf HTTP/1.1“200 22”-“Mozilla/5.0(Windows NT 6.1;WOW64;rv:29.0)G