将 playframework 升级到 2.4.6 后 Global.java 的 onstart 方法被执行两次

Posted

技术标签:

【中文标题】将 playframework 升级到 2.4.6 后 Global.java 的 onstart 方法被执行两次【英文标题】:onstart method of Global.java getting executed twice after upgrading playframework to 2.4.6 【发布时间】:2017-12-10 04:53:38 【问题描述】:

我刚刚将我的应用程序从 play framework 2.3.9 升级到了 2.4.6。一切正常,但 onstart(Application app) 方法被执行了两次。由于我在 onstart 方法中创建了一些调度程序,它们也被执行了两次。

Global.java

public class Global extends GlobalSettings 

public void onStart(Application app) 
    Logger.info("Application has started");
    JPA.withTransaction(() -> 
        if (ConfigHelper.getGlobalValue("install").equalsIgnoreCase("xyz")) 
            Logger.info("Starting pqr scheduler");
            ActorRef myActor = Akka.system().actorOf(
                    Props.create(PQR.class));
            FiniteDuration delay = FiniteDuration.create(0, TimeUnit.SECONDS);
            FiniteDuration frequency = FiniteDuration.create(10, TimeUnit.MINUTES);
            Akka.system()
                    .scheduler()
                    .schedule(delay, frequency, myActor, "start", Akka.system().dispatcher(), myActor);
        

            );



public void onStop(Application app) 
    Logger.info("Application shutdown...");




plugin.sbt 文件如下

logLevel := Level.Warn


resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/"

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.6")
addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.6")

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "2.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")


addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.1")

addSbtPlugin("net.ground5hark.sbt" % "sbt-css-compress" % "0.1.3")

addSbtPlugin("net.ground5hark.sbt" % "sbt-closure" % "0.1.3")

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-gzip" % "1.0.0")

build.sbt 如下:

name := "project name"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  javaJdbc, javaJpa, cache, javaWs,
  "org.hibernate" % "hibernate-entitymanager" % "4.3.9.Final",
  "mysql" % "mysql-connector-java" % "5.1.35",
  "com.amazonaws" % "aws-java-sdk-ses" % "1.9.38",
  "com.amazonaws" % "aws-java-sdk-s3" % "1.9.38",
  "org.freemarker" % "freemarker" % "2.3.22"
)

resolvers += "Sonatype" at "url"

credentials += Credentials("Repository Manager", "***", "***", "****")

注意:我在项目中使用的是 jpa。任何帮助将不胜感激。

【问题讨论】:

可能值得尝试完全摆脱 Global,因为它已被弃用。 是的,你是对的,这是我未来的计划。但目前我需要一个热修复来解决这个问题,因为调度程序被执行了两次。 【参考方案1】:

我在生产中遇到了同样的问题,而不是在开发模式下。

我在多个 dyno 上的 heroku 上运行生产,Global.java(以及我从 Global.java 触发的后台作业)执行的次数与我的 dyno 数量一样多。

这是关于如何只执行一次的答案: Play 2 Heroku startup with multiple dynos

【讨论】:

以上是关于将 playframework 升级到 2.4.6 后 Global.java 的 onstart 方法被执行两次的主要内容,如果未能解决你的问题,请参考以下文章

缺少包'play.filters.cors.CORSFilter' - Play Framework 2.4.6 (Java)

将项目升级到 Play Framework 的 2.2.0 版本

升级到Apache 2.4.6后出错

将验证码添加到 PlayFramework 1.2.x 登录页面

如何将变量从 PlayFramework 1.2.4 传递到 Javascript

使用数据 URI 将图像上传到使用 Java(PlayFramework-2.6 或纯 Java)的服务器