【问题标题】:two contexts one server jetty两个上下文一个服务器码头
【发布时间】:2015-08-22 11:59:38
【问题描述】:

我有两个 jetty 嵌入式服务器, 本地主机:9001/WebApp1 和本地主机:9002/WebApp2, 如您所见,它们位于不同的端口上。 我希望他们在创建服务器期间共享相同的端口 是否可以? (顺便说一句,它们也是两个单独的 jar 文件)。 所以我可以做这样的事情吗 localhost:9001/WebApp1 和 localhost:9001/WebApp2

还是我坚持制作战争文件然后拥有它们 包含在 tomcat/glassfish 服务器中

在创建服务器的过程中我通常会看到这个

ContextHandler context = new ContextHandler();
context.setContextPath("/WebApp1");
context.setHandler(new WebApp1());
Server server = new Server(9001);
server.setHandler(context);
server.start();            
server.join();

在第二个应用程序上,我想要一些看起来像这样的东西

ContextHandler context = new ContextHandler();
context.setContextPath("/WebApp2");
context.setHandler(new WebApp2());
Server server = getExistingServer(9001);
server.addHandler(context);

我看到有这样的方法 server.getHandlers();它返回一个处理程序数组我如何将新的处理程序添加到现有列表中,或者让现有的码头服务器在端口 9001 上运行

【问题讨论】:

  • 两个单独运行的应用程序不能共享一个端口。但是,您也可以在 Jetty 中部署战争,但这意味着放弃嵌入式模型。
  • 看来正确的做法是使用war文件不?如果我正确使用war文件,我将使用Servlet而不是服务器实例并手动添加处理程序是正确的吗?由于嵌入式模式,我是 java EE 菜鸟和首选码头,但我也希望看到我的程序可能使用 tomcat/glassfish 服务器在线运行
  • 如果您的目标不仅仅是 Jetty,那么使用标准的 WAR 部署模型是不错的选择。

标签: java jetty


【解决方案1】:

Jetty 是一个标准的 servlet 容器,当然可以处理不同的上下文。 请参阅 Jetty 文档第 24 章中的 Embedding Contexts 部分。

这是ManyContexts example(Jetty 文档的一部分):

public class ManyContexts
{
  public static void main( String[] args ) throws Exception
  {
    Server server = new Server(8080);

    ContextHandler context = new ContextHandler("/");
    context.setContextPath("/");
    context.setHandler(new HelloHandler("Root Hello"));

    ContextHandler contextFR = new ContextHandler("/fr");
    contextFR.setHandler(new HelloHandler("Bonjoir"));

    ContextHandler contextIT = new ContextHandler("/it");
    contextIT.setHandler(new HelloHandler("Bongiorno"));

    ContextHandler contextV = new ContextHandler("/");
    contextV.setVirtualHosts(new String[] { "127.0.0.2" });
    contextV.setHandler(new HelloHandler("Virtual Hello"));

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    contexts.setHandlers(new Handler[] { context, contextFR, contextIT, contextV });

    server.setHandler(contexts);

    server.start();
    server.join();
  }
}

【讨论】:

  • 此示例代码适用于一个 .jar 文件,但我的有两个单独的 .jar 文件,我想同时运行它们,当我运行第二个时,我不能再使用同一个端口给我一个 java.net.BindException: Address already in use: bind
  • 您的应用程序有一个主类,您可以在其中启动一个嵌入式 Jetty。但是你可以有几个上下文。对应的类在哪个 JAR 文件中并不重要,只要在类路径中。所以你有一个进程运行着一个 Jetty 和你的两个 JAR。
  • 我最终使用了 .war 文件,这个特定的答案可以解决问题,但我担心我们的服务器人员不允许我运行码头服务器的实例,因为他们只想看到 tomcat 在那里运行,无论如何感谢您的回答
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2019-06-01
相关资源
最近更新 更多