【问题标题】:Can I change the port of an embedded Tomcat at runtime?我可以在运行时更改嵌入式 Tomcat 的端口吗?
【发布时间】:2014-02-19 21:19:09
【问题描述】:

我正在使用嵌入在我的 Java 8 应用程序中的 Tomcat。我尝试像这样在运行时切换端口:

 Tomcat tomcat = new Tomcat();
    tomcat.setPort(18080);

    Timer timer =new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            tomcat.setPort(18181);
        }
    },240000L);

但它似乎不起作用。在达到定时器延迟后,wepapp 仍然只响应端口 18080。

甚至可以在运行时切换吗?我该怎么做?

编辑:

在 JDK 1.8.0b129 上使用 Tomcat 嵌入式 8.0.3

我想避免重新启动服务器,因为启动过程需要很长时间。

【问题讨论】:

  • 为什么要改端口?
  • 另一个服务器应用程序必须尽可能无缝地在此端口上提供服务,因此这是为了避免任何停机时间。
  • @thejeed 找到解决方案了吗?
  • @DavidWelch 不幸的是,我没有。

标签: java tomcat java-8 tomcat8


【解决方案1】:

你应该尝试重启服务器:

timer.schedule(new TimerTask() {
        @Override
        public void run() {
            tomcat.stop();
            tomcat.setPort(18181);
            tomcat.start();
            tomcat.getServer().await();
        }
},240000L);

【讨论】:

  • 很遗憾,启动过程非常昂贵,所以我想避免重新启动服务器。
【解决方案2】:

您需要调用其默认的 http 连接器 destroy 方法,但我不知道这在 Tomcat 8 中是否可行。

【讨论】:

  • 你的方法几乎奏效了。我在连接器上调用stop()destroy(),然后实例化一个新连接器并将其分配给服务器实例。不幸的是,在那之后无法处理任何请求 - 我从 Coyote.postParseRequest() 获取 NPE。
猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多