【问题标题】:Jhipster executable jar with undertow does not work - 404带有undertow的Jhipster可执行jar不起作用 - 404
【发布时间】:2016-06-01 02:51:46
【问题描述】:

我构建了一个 jhipster 应用程序。添加了一个实体。用

构建它
mvn -Pprod package

当我使用tomcat时,应用程序运行良好

java -jar xyz.war

但是,由于我们需要 Undertow 来处理高负载场景和快速启动时间,所​​以我只需在所有地方(所有配置文件)中根据 Spring 文档提到 tomcat 启动器依赖项,将 maven 依赖项从 Tomcat 更改为 Undertow:@ 987654321@

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

从 Eclipse 运行时运行良好,我可以看到请求现在由 Undertow 提供服务,而不是 Tomcat,因为日志将 XNIO 打印为线程 ID。

但是,当我再次构建它并尝试使用java -jar xyz.war 运行它时,

应用程序启动正常,但是当我点击 URL 时

http://127.0.0.1:8081 

http://127.0.0.1/xyz

它说没有找到。

我还需要做什么才能让嵌入 Undertow 的 jHipster 应用程序正常工作?

任何作为在我们组织中推动 jHipster 的关键 POC 的快速帮助都取决于此步骤。

【问题讨论】:

  • 我们曾经用我们的快速配置文件支持 undertow,但我们在下一个版本中放弃了它,因为现在不需要快速配置文件,而且我们上次检查时 undertow 不支持 websockets。因此,从您的帖子看来,您似乎正在尝试使用开发配置文件运行。您是否也尝试在 prod 配置文件中运行它?
  • 顺便说一句,您使用的是什么 jhipster 版本?如果它是 2.27 或更低,则生成一个应用程序并尝试运行mvn -Pfast package,然后运行java -jar xyz.war -Dspring.profiles.active=fast,dev,而不修改默认情况下应该使用 undertow 的任何内容
  • 您好,Deepu,感谢您关注此线程并回复。我尝试使用 --spring.profiles.active=dev,fast 但我认为它正在回退到 tomcat 并且并没有真正启动 Undertow。当我使用 rampusers(900) 对应用程序进行 gatling 测试并打开可视 VM 时,我注意到创建的线程的名称以“nio....”开头,并且线程数
  • 当我使用 rampusers(900) 对应用程序进行 Gatling 测试并打开可视 VM 时,我注意到创建的线程的名称以“nio....”开头,并且创建的线程数大约是 215。如果我只是将 pom 依赖项更改为“spring-boot-starter-undertow”并在 main 方法的帮助下通过 eclipse 运行它,那么在视觉 vm 中看到的线程命名约定是它们以“XNIO..在 900 个用户的 Gatling 测试中,使用的线程总数仅为 50。
  • 而我使用的jHipster版本是2.27

标签: jhipster


【解决方案1】:

我们曾经支持 Undertow,但最近将其删除。所以你不应该有太多的麻烦来设置它(你所做的看起来不错,然后你不会发布你的整个配置,所以很难说)。 无论如何,关于您的特定用例,您需要知道我们为什么删除 Undertow:

  • 启动时间确实更短,大约 300-500 毫秒。我们主要在“开发”配置文件中使用它,因为启动时间很重要。但是现在我们有了 Spring Dev Tools 热重启,这已经不再有用了。
  • 对于“prod”使用,我没有看到 Tomcat 和 Undertow 之间的任何性能差异。与仅访问一次数据库(花费数毫秒)相比,我想您看不到这种改进。

此外,我们还删除了 Undertow,因为它缺少一些对我们来说很重要的功能。最重要的是:

  • GZip 压缩支持 -> 因为你会失去它,你的性能实际上会比使用 Tomcat 更糟糕
  • Websocket 支持

最后但同样重要的是,通过添加新节点可以轻松扩展您的 JHipster 应用程序(在 JHipster 3.0 中会更容易),因此处理大量用户应该不是问题。

【讨论】:

  • 您好 Julien,感谢您的回复。但是如果你们决定不支持Undertow,那真的很不幸。对我们来说,Undertow 的主要用例如下: 1. 它消耗的 CPU 资源太少。 Undertow 生成的线程总数约为 56,而 tomcat 生成的线程总数约为 215,用于 rampusers 的 Gatling 测试(900)。默认情况下,Undertow 每个 CPU 只产生 1 个工作线程和每个 CPU 10 个任务线程。虽然 Tomcat 在不到 800 毫秒的时间内只能执行 75% 的总请求,但 Undertow 仅使用 55 个线程就可以完成大约 81% 的请求。
  • AFA Gzipping 被考虑在内,我们的计划是无论如何在 nginx 后面部署静态内容,对于 Rest API 的响应,我猜他们的 gzipping 也可以在 nginx 中完成。 (附带说明,我正在努力增强 jHipster POM 以在构建时发出包含静态内容的单独 Zip,以便它们可以部署在反向代理服务器上 - 如果社区认为这很有用,我可能会将其回馈给 jHipster )
  • AFA websocket 支持被考虑,Undertow 表示它完全支持它。 undertow.io/undertow-docs/undertow-docs-1.3.0/index.html
  • 请注意:我上面提到的所有性能测试都是在我使用 jHipster 控制台手动将所有记录器置于 ERROR 模式之后进行的。这是我用胖 jar 测试它所做的唯一更改:删除 spring-boot-starter-tomcat 并在 dev 和 prod 配置文件中添加 spring-boot-starter-undertow 。适用于 eclipse,不适用于 java -jar 选项。
  • 优秀的积分@SRK !事实上,这很有趣,我在我们的 bugtracker here 上为此创建了一张新票,所以我们可以考虑切换到 Undertow。
【解决方案2】:

我没有遇到您的错误。 Undertow 似乎对我来说很好用。

1) 我生成了一个新的 JHipster 项目(来自 master),所有默认选项

2) 我只在 pom.xml 的这一部分用 undertow 替换了 tomcat:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- log configuration -->
            <logback.loglevel>DEBUG</logback.loglevel>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>prod</id>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
            </dependency>
        </dependencies>

3) 构建:

mvn package -Pprod

4) 启动数据库:

docker-compose -f src/main/docker/prod.yml up -d

5) 启动应用程序

java -jar target/*.war --spring.profiles.active=prod

:: JHipster ?  :: Running Spring Boot 1.3.2.RELEASE ::
:: http://jhipster.github.io ::

2016-02-22 00:18:40.051  INFO 6118 --- [           main] com.mycompany.myapp.JhundertowApp        : Starting JhundertowApp on pgrXps with PID 6118 (started by pgrimaud in /home/pgrimaud/workspace/tests2/32-undertow)
2016-02-22 00:18:40.054  INFO 6118 --- [           main] com.mycompany.myapp.JhundertowApp        : The following profiles are active: prod
2016-02-22 00:18:44.024  WARN 6118 --- [           main] io.undertow.websockets.jsr               : UT026009: XNIO worker was not set on WebSocketDeploymentInfo, the default worker will be used
2016-02-22 00:18:44.126  WARN 6118 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2016-02-22 00:18:44.742  INFO 6118 --- [           main] c.mycompany.myapp.config.WebConfigurer   : Web application configuration, using profiles: [prod]

6) 我更改登录应用程序以确认它使用 undertow 运行

----------------------------------------------------------
    Application 'jhundertow' is running! Access URLs:
    Local:      http://127.0.0.1:8080
    External:   http://127.0.1.1:8080
----------------------------------------------------------
2016-02-22 00:20:20.585 TRACE 6118 --- [ XNIO-2 task-31] c.m.m.c.l.AngularCookieLocaleResolver    : Parsed cookie value [%22en%22] into locale 'en'
2016-02-22 00:20:25.741 TRACE 6118 --- [ XNIO-2 task-32] c.m.m.c.l.AngularCookieLocaleResolver    : Parsed cookie value [%22en%22] into locale 'en'

【讨论】:

  • @SRK 可能会遵循 pgrimaud 在新应用上所做的操作,然后将其与您的设置进行比较
  • 是的。我只是尝试了同样的事情,但无论我做什么,结果都是一样的——没有找到。这是在 Windows 7 机器上。
  • 这是我在 win7 上的 yo-rc : '{ "generator-jhipster": { "baseName": "cfepoc6", "packageName": "com.ev.cfe", "packageFolder" :“com/ev/cfe”,“authenticationType”:“xauth”,“hibernateCache”:“no”,“clusteredHttpSession”:“no”,“websocket”:“no”,“databaseType”:“mongodb”,“ devDatabaseType”:“mongodb”,“prodDatabaseType”:“mongodb”,“searchEngine”:“no”,“useSass”:false,“buildTool”:“maven”,“frontendBuilder”:“grunt”,“enableTranslation”:false , "enableSocialSignIn": false, "testFrameworks": [ "gatling" ] } }'
【解决方案3】:

对我来说幸运的是,当我将同一个 war 文件移动到 RHEL 系统时,它工作得很好。 :-) 我接受@pgrimaud 的回答。感谢@deepu 和@Julien。你们真棒。

我将调查我的 Win7 机器上出了什么问题——如果我能弄清楚,我会在此回复。 (npm clear cache dint help。将重新安装 node.js 和 npm,因为我已经为我的其他 node.js 工作更新了它们 - 我会看看是否有帮助)。我也会尝试调试 spring-boot-starter-undertow。

【讨论】:

    【解决方案4】:

    终于,克星的解决方案已经到位。这是我的更新 - 今天,我开始调试 spring boot 和 undertow 代码,并意识到 spring boot 正在以下位置寻找资源:

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/" };
    

    之后,我在 META-INF 目录中创建了一个名为 resources 的文件夹,并使用 7zip 复制了其中的所有资源。 你瞧,它有效! :-)。

    虽然 spring boot 应该也从

    加载资源
    private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" }; 
    

    由于某种原因,它没有这样做。 (这是 jHipster 放置所有资源文件的地方)

    我认为这是 jHipster 使用的 spring boot 版本的错误,我将我的应用程序 spring boot 版本升级到 1.3.3.RELEASE ,但这也无济于事。

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2015-06-28
      • 2012-08-08
      • 2011-05-29
      • 2018-09-25
      • 1970-01-01
      • 2012-11-21
      • 2017-11-19
      • 2015-01-13
      相关资源
      最近更新 更多