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

嵌入式码头升级问题从6.1.7到9.4.43

澹台展鹏
2023-03-14

我在旧的jetty版本中使用jetty.xml进行配置,如下所示:

<Configure id="Server" class="org.mortbay.jetty.Server">
    <Set name="ThreadPool">
        <New class="org.mortbay.thread.BoundedThreadPool">
            <Set name="minThreads">10</Set>
            <Set name="maxThreads">250</Set>
            <Set name="lowThreads">25</Set>
        </New>
    </Set>

    <Call name="addConnector">
        <Arg>
            <New class="org.mortbay.jetty.nio.SelectChannelConnector">
                <Set name="host">
                    <SystemProperty name="jetty.host"/>
                </Set>
                <Set name="port">
                    <SystemProperty name="jetty.port" default="9096"/>
                </Set>
                <Set name="maxIdleTime">30000</Set>
                <Set name="Acceptors">2</Set>
                <Set name="statsOn">false</Set>
                <Set name="confidentialPort">8443</Set>
                <Set name="lowResourcesConnections">5000</Set>
                <Set name="lowResourcesMaxIdleTime">5000</Set>
            </New>
        </Arg>
    </Call>

    <Set name="handler">
        <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
            <Set name="handlers">
                <Array type="org.mortbay.jetty.Handler">
                    <Item>
                        <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
                    </Item>
                    <!-- Disabling this as it is a security risk (by exposing all contexts) in production-->
                    <!--Item>
                        <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
                    </Item-->
                    <Item>
                        <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
                    </Item>
                </Array>
            </Set>
        </New>
    </Set>

    <Call name="addLifeCycle">
        <Arg>
            <New class="org.mortbay.jetty.deployer.ContextDeployer">
                <Set name="contexts">
                    <Ref id="Contexts"/>
                </Set>
                <Set name="configurationDir">
                    <SystemProperty name="jetty.home" default="."/>/contexts</Set>
                <Set name="scanInterval">1</Set>
            </New>
        </Arg>
    </Call>

    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/output</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/../cache/</Set>
        <Call name="addServlet">
            <Arg>com.myservlet.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <Ref id="RequestLog">
        <Set name="requestLog">
            <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
                <Set name="filename">
                    <SystemProperty name="jetty.logs" default="../logs"/>/ws.request_yyyy_mm_dd.log</Set>
                <Set name="filenameDateFormat">yyyy_MM_dd</Set>
                <Set name="retainDays">90</Set>
                <Set name="append">true</Set>
                <Set name="extended">true</Set>
                <Set name="logCookies">false</Set>
                <Set name="LogTimeZone">GMT</Set>
            </New>
        </Set>
    </Ref>
    <!-- =========================================================== -->
    <!-- extra options                                               -->
    <!-- =========================================================== -->
    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    <Set name="gracefulShutdown">1000</Set>
</Configure>```

And to call this configuration following code has been written:
    <Ref id="RequestLog">
        <Set name="requestLog">
            <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
                <Set name="filename">
                    <SystemProperty name="jetty.logs" default="../logs"/>/ws.request_yyyy_mm_dd.log</Set>
                <Set name="filenameDateFormat">yyyy_MM_dd</Set>
                <Set name="retainDays">90</Set>
                <Set name="append">true</Set>
                <Set name="extended">true</Set>
                <Set name="logCookies">false</Set>
                <Set name="LogTimeZone">GMT</Set>
            </New>
        </Set>
    </Ref>
    <!-- =========================================================== -->
    <!-- extra options                                               -->
    <!-- =========================================================== -->
    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    <Set name="gracefulShutdown">1000</Set>
</Configure>

已编写以下代码来调用此配置:

Server myServer;
File theConfigFile = new File( "C://jetty//etc//jetty.xml" );
XmlConfiguration theXmlConfiguration = new XmlConfiguration( theConfigFile.toURL() );
theXmlConfiguration.configure( myServer );
myServer.start();

我试图使用jetty 9.4.43创建类似的配置:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
 
<Configure id="jetty" class="org.eclipse.jetty.server.Server">
    <New id="threadPool" class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <Set name="minThreads" type="int"><Property name="jetty.threadPool.minThreads" deprecated="threads.min" default="10"/></Set>
        <Set name="maxThreads" type="int"><Property name="jetty.threadPool.maxThreads" deprecated="threads.max" default="200"/></Set>
        <Set name="reservedThreads" type="int"><Property name="jetty.threadPool.reservedThreads" default="25"/></Set>
        <Set name="idleTimeout" type="int"><Property name="jetty.threadPool.idleTimeout" deprecated="threads.timeout" default="60000"/></Set>
        <Set name="detailedDump" type="boolean"><Property name="jetty.threadPool.detailedDump" default="false"/></Set>
    </New>
    
    <Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/>
      </Arg>
    </Call>
 
   <Set name="connectors">
    <Array type="org.eclipse.jetty.server.Connector">
      <Item>
        <New class="org.eclipse.jetty.server.ServerConnector">
          <Arg><Ref refid="jetty"/></Arg>
          <Set name="port">
            <Property name="jetty.http.port" default="9096" />
          </Set>
        </New>
      </Item>
    </Array>
  </Set>

    <Set name="handler">
      <New class="org.eclipse.jetty.server.handler.HandlerList">
        <Set name="handlers">
      <Array type="org.eclipse.jetty.server.Handler">
        <Item>
          <New class="org.eclipse.jetty.server.handler.ResourceHandler">
            <Set name="directoriesListed">true</Set>
            <Set name="resourceBase">.</Set>
          </New>
        </Item>
      </Array>
        </Set>
      </New>
    </Set>
    
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/output</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/../cache/</Set>
        <Call name="addServlet">
            <Arg>com.myservlet.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>

    <Set name="stopAtShutdown"><Property name="jetty.server.stopAtShutdown" default="true"/></Set>
    <Set name="stopTimeout"><Property name="jetty.server.stopTimeout" default="5000"/></Set>
    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" deprecated="jetty.dump.start" default="true"/></Set>
    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" deprecated="jetty.dump.stop" default="true"/></Set>
</Configure> 

使用新的jetty.xml,端口9096被公开,intelliJ运行所在的目录下的所有可用文件都可以访问,但FileProxyServlet url(即localhost:9096/cts/output)不可访问(显示HTTP错误404 Not Found)。以前不是这样,只有servlet工作正常。

以下是使用新码头运行的控制台日志:

系统属性[DEBUG]已被否决!(改用org . eclipse . jetty . level = DEBUG)2021-10-16 13:56:48.162:INFO::main:logginated @ 80050 ms to org . eclipse . jetty . util . log . stderrlog[shut down monitor]未启用(端口

  • 启动=QueuedThreadPool[qtp1589931229]@5ec46cdd{启动,8

过去几天我一直在努力解决这个问题,有谁能帮我吗?

共有1个答案

柳俊逸
2023-03-14

我建议做一些改变。

首先,< code>ResourceHandler不会为您做任何事情。

<Array type="org.eclipse.jetty.server.Handler">
  <Item>
    <New class="org.eclipse.jetty.server.handler.ResourceHandler">
      <Set name="directoriesListed">true</Set>
      <Set name="resourceBase">.</Set>
    </New>
  </Item>
</Array>

它最多只能坐在那里,什么也不做。(因为它没有上下文,所以没有请求可以到达它)。最糟糕的是,按照设置方式,您现在已经通过ResourceHandler共享了整个驱动器。

移除它。

接下来,ServletContext的声明。。。

<New class="org.eclipse.jetty.servlet.ServletContextHandler">
  <Arg>
    <Ref id="Contexts"/>
  </Arg>
  <Arg>/cts/output</Arg>
  <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/../cache/</Set>
  <Call name="addServlet">
    <Arg>com.myservlet.webservices.remote.FileProxyServlet</Arg>
    <Arg>/</Arg>
  </Call>

关于这个声明的事情。。。

  • 它不会结束它
    < li >删除< code >
    < li >上下文路径规则是(必须以< code>/开头,并且不能在任何地方包含任何其他斜杠,没有嵌套的上下文路径,这就是url-patterns的用途) < li >不要试图使用构造函数来设置上下文路径,请使用setter。 < li >删除此< code >
  • 修复此url模式
    < li >如果您直接声明它,只需将< code >

你有一个奇怪且坦率的破碎的用法组合,即使是Jetty 6也不应该允许。

默认url模式(即/)上不能有FileProxyServlet,并且不能同时提供静态资源。

建议,正确使用码头(这些建议也适用于6号码头,并一直回到4号码头!

  1. 不要混用ServletContextHandlerResourceHandler
  2. 仅使用ServletContextHandler
  3. 使ServletContextHandlercontextPath仅/ctx
  4. 使ServletContextHandlerresourceBase指向静态文件内容所在的位置(目录或jar:file://url)。
  5. 将普通的DefaultServlet添加到ServletContextHandler中(确保它命名为“default”,并且是唯一映射到/
  6. 添加您的com.myservlet.webservices.remote。FileProxyServlet到url模式/output
  7. 最后,将ServletContextHandler添加到服务器Handler树中

这里有一些来自过去答案的更多信息,我鼓励你们阅读。

  • Jetty:默认servlet上下文路径
  • 从嵌入式Jetty中的备用路径提供静态文件
  • ServletContextHandler之间的区别是什么。setResourceBase和ResourceHandler。使用Jetty嵌入式容器时是否设置ResourceBase
  • 用于服务内容的嵌入式码头处理URL
  • 如何配置Jetty Handler
  • 从嵌入式Jetty中的备用路径提供静态文件
  • Jetty:如何嵌套HandlerWrapper、HandlerList、ContextHandlerCollection和ContextHander

问题是,完全在单个XML文件中执行此操作令人困惑(当Jetty 6.0.0首次发布时,不鼓励使用单个XML文件来配置Jetty)。您是否考虑过已经使用jetty-home附带的XML文件,并在您自己的嵌入式jetty启动中引用它们(以正确的顺序)?

这意味着您只需手动定义< code > ServletContextHandler ,并将其放在您希望< code>WebAppProvider查找要部署的上下文的任何位置。

额外的好处是,您升级Jetty版本的努力变得微不足道。

 类似资料:
  • 我在嵌入式Jetty中部署rest Web服务(Jersey)。 我的服务器: 方法:

  • 在项目设置中将项目SDK更改为1.7 在项目设置中将所有模块SDK更改为1.7 将Maven runner JRE更改为1.7 将windows环境变量中的JAVA_HOME更改为JDK 1.7位置 将BEA_JAVA_HOME和SUN_JAVA_HOME更改为我的域中setdomainenv.sh中的JDK 1.7位置 将commenv.sh文件中的JAVA_HOME更改为1.7 但当我运行pr

  • 您好,我有一个带有嵌入式按键锁的SpringBoot应用程序,使用下面的示例 https://www.baeldung.com/keycloak-embedded-in-spring-boot-app 我正在尝试将Keycloak从12升级到14,并将reeasy升级到3.15.1.Final,infinispan升级到11.0.9.Final。应用程序无法启动,并且除了 NullPointerE

  • 我已经将我的项目从Angular 4升级到Angular 7,并且我得到以下错误: node_modules/@ng-bootstrap/ng-bootstrap/typeahead/typeahead.d.ts(3,10)中的错误:错误TS2305:模块“d://usman/dev_area/code/physician-portal/node_modules/rxjs/observable”没

  • 在我当前的项目中,我们使用的是Spring 3.0.5(core、aop、beans、web、webmvc等)。然而,我们希望使用“Spring Security SAML Extension 1.0.0 RC3”来构建一个服务提供商,该服务提供商已经过Spring 3.1.2、Spring Security 3.1.2和OpenSAML 2.5.3的全面测试。 从Spring 3.0.5升级到S

  • 我刚刚将我的Android Studio从1.0 RC 2升级到1.0.1。 之后,我被提示将gradle插件从0.14.0更新到1.0.0。 一旦我这么做了,Gradle构建就失败了- 还有其他人面临过类似的问题吗?非常感谢! 我的身材。格拉德尔-