Play 运行和启动有什么区别?

2024-01-09

我想了解在以下问题的背景下运行 play start 和 play run 之间的差异。

我的具体用例相当复杂,但我会像这样简化它:

  • 启动时(作为 Global.scala 的一部分),我的 Play 应用程序对 Java 应用程序 X 的入口点进行直接方法调用。
  • 作为初始化的一部分,X 启动 Tomcat 的嵌入式实例。
  • 在 X 初始化结束时,它会验证 Tomcat 是否已启动并响应请求。

现在,当我这样做时play start在此应用程序上,Tomcat 已启动并正在运行,X 很高兴,生活还在继续。

然而,当我这样做时play run,Tomcat 无法初始化,X 坐在那里等待响应,最终超时。

我需要使用的主要原因play run用于开发,因为我想附加 Eclipse 调试器来运行play debug run.

我意识到这是过于简单化了,但我希望从您那里得到的是导致 Play run 和 Play start 之间的差异,这可能会改变我的应用程序的行为,从而导致此失败。

现在,我尝试增加 Play 默认线程池中的线程数,如下http://www.playframework.com/documentation/2.1.x/ThreadPools http://www.playframework.com/documentation/2.1.x/ThreadPools但没有运气。

播放输出和日志没有给我提供有关此问题的有用信息。

我使用的是 Play 2.1.1


  • play run启动播放应用程序发展模式.

    这意味着它从播放提示符中运行(实际上是在 SBT 中),并使用一些自定义类加载器魔法来允许自动重新加载类、自动编译模板等。这种运行应用程序的自定义方式可能会阻止 Tomcat开始。

    如果没有 Tomcat 的一些日志输出或堆栈跟踪,就很难详细说明 Tomcat 无法启动的原因。这有点类似于在另一个容器中启动 Tomcat,该容器通过自定义类加载器提供隔离(例如 Tomcat)。

    Edit:我自己并不知道具体细节,但这一切都发生在播放运行命令 https://github.com/playframework/playframework/blob/2.1.3/framework/src/sbt-plugin/src/main/scala/PlayCommands.scala#L487reloader https://github.com/playframework/playframework/blob/2.1.3/framework/src/sbt-plugin/src/main/scala/PlayReloader.scala。好像是更多记录 https://github.com/playframework/playframework/blob/master/framework/src/sbt-plugin/src/main/scala/PlayRun.scala#L108在 master 中,虽然我不知道 2.1.x 和 2.2.x 之间是否发生了变化。

  • play start是一种运行应用程序的交互式方式生产方式.

    这意味着它与调用完全相同java -cp [...] YourMainClass,除非它从播放提示中交互运行(需要Ctrl+D分离)而不是在后台(因此它不适合自动部署)。

但是,对于实际生产,您应该准备一个独立版本play dist命令,然后按照描述使用包含的脚本启动它在文档中 http://www.playframework.com/documentation/2.1.x/ProductionDist.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play 运行和启动有什么区别? 的相关文章

随机推荐