【发布时间】:2012-10-15 21:11:06
【问题描述】:
我在 Play 2.0.4 中有一个独立的工作,我想在 Heroku 上运行,如 https://github.com/jamesward/play2-scheduled-job-demo 中所述 我就像在示例中一样启动应用程序:
public class QueueWorker {
public static void main(String[] args) {
Application application = new Application(new File(args[0]), QueueWorker.class.getClassLoader(), null, Mode.Dev());
Play.start(application);
}
}
但是现在,从日志来看,Play 出于某种原因连接到数据库两次,而 EhCache 第二次失败,因为它的名称已经注册:
[[37minfo[0m] play - database [default] connected at jdbc:mysql://localhost/myproject?characterEncoding=UTF-8
[[37minfo[0m] play - database [default] connected at jdbc:mysql://localhost/myproject?characterEncoding=UTF-8
Exception in thread "main" net.sf.ehcache.ObjectExistsException: Cache play already exists
at net.sf.ehcache.CacheManager.addCache(CacheManager.java:990)
at play.api.cache.EhCachePlugin.x$3(Cache.scala:111)
at play.api.cache.EhCachePlugin.cache(Cache.scala:109)
at play.api.cache.EhCachePlugin.onStart(Cache.scala:127)
at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at play.api.Play$.start(Play.scala:60)
at play.api.Play.start(Play.scala)
at jobs.QueueWorker.main(QueueWorker.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
有趣的是,当我使用“play run”命令启动项目时,这不会发生。有没有人告诉我这可能是什么,或者我如何调试它的来源?
【问题讨论】:
-
澄清一下,我在 IntelliJ 中启动 QueueWorker 时只使用了“。”作为参数,而不是在 Heroku 上。因此,我认为 Procfile 与它没有任何关系。
-
啊好的。您是否创建了 Global.onStart() 方法?我还在代码中注意到,如果您在应用程序中使用
Mode.Dev(),但您可以尝试使用Mode.Prod()。 -
是的,我已经实现了 Global.onStart()。如果我将其注释掉,我仍然会收到错误消息。切换到 Mode.Prod() 也没有改变任何东西。
-
我刚刚用一个 2.0.3 的应用做了一个测试,我没有这个问题。您在使用其他插件或模块吗?
-
play2-scheduled-job-demo 的示例也适用于我的 2.0.4 安装。我无法解释我的应用程序发生了什么。我使用 Guice 和 play-authenticate 模块,但是如果我将它们全部从 play.plugins 中扔掉,它也不会改变任何东西。
标签: playframework playframework-2.0