【问题标题】:jetty get webapp listjetty 获取 webapp 列表
【发布时间】:2014-01-31 06:46:32
【问题描述】:

我需要在 init 方法中从服务器获取一些服务器属性到我的 servlet,任何请求执行之前(在 init 方法中)。实际上,我需要得到所有在这个服务器连接器上工作的列表,所有工作的 web 应用程序,最重要的是 - 端口号或连接器。 所需的码头版本 - 最多 8 个版本,包括。

所以我需要像org.eclipse.jetty.server.Server 这样的东西,但不是嵌入式的,而是来自现有服务器,我的servlet 正在运行。 就使用此信息操作的 webapp 部署程序而言,此信息应在码头上。但我找不到在哪里。

【问题讨论】:

    标签: java servlets jetty embedded-jetty


    【解决方案1】:

    在 Jetty 的 start.ini 中启用 JMX 将允许您使用类似于以下的代码:

    final MBeanServer mBeanServerConnection = ManagementFactory.getPlatformMBeanServer();
    final String[] portAttribute = new String[] {"port"};
    
    // Jetty 9 MBeans
    final ObjectName webappcontext9 = new ObjectName("org.eclipse.jetty.webapp:context=*,type=webappcontext,id=*");
    final Set<ObjectName> webappcontexts9 = mBeanServerConnection.queryNames(webappcontext9, null);
    for (final ObjectName objectName : webappcontexts9) {
        System.out.println(objectName.getKeyProperty("context"));
    }
    
    final ObjectName serverconnector9 = new ObjectName("org.eclipse.jetty.server:context=*,type=serverconnector,id=*");
    final Set<ObjectName> serverconnectors9 = mBeanServerConnection.queryNames(serverconnector9, null);
    for (final ObjectName objectName : serverconnectors9) {
        System.out.println("listening port for " + objectName.getCanonicalName() + " is " + mBeanServerConnection.getAttributes(objectName, portAttribute).asList().get(0).getValue());
    }
    
    // Jetty 8 and 7 MBeans
    final ObjectName webappcontext8 = new ObjectName("org.eclipse.jetty.webapp:type=webappcontext,id=*,name=*");
    final Set<ObjectName> webappcontexts8 = mBeanServerConnection.queryNames(webappcontext8, null);
    for (final ObjectName objectName : webappcontexts8) {
        System.out.println(objectName.getKeyProperty("name"));
    }
    
    final ObjectName serverconnector8 = new ObjectName("org.eclipse.jetty.server.nio:type=selectchannelconnector,id=*");
    final Set<ObjectName> serverconnectors8 = mBeanServerConnection.queryNames(serverconnector8, null);
    for (final ObjectName objectName : serverconnectors8) {
        System.out.println("listening port for " + objectName.getCanonicalName() + " is " + mBeanServerConnection.getAttributes(objectName, portAttribute).asList().get(0).getValue());
    }
    

    当然,您需要将 Jetty 配置为最后加载包含此代码的 Web 应用程序,否则它将无法获取加载的其他 Web 应用程序的完整列表。

    【讨论】:

    • 好的,这个答案值得赏金,但我知道应该有一种方法可以通过命名和目录接口而不是通过 JMX 来获得所有这些。