我想了解在以下问题的背景下运行 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#L487和reloader 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(使用前将#替换为@)