将play框架1.2.4与scala结合使用。 我几乎没有看起来像
的游戏工作@OnApplicationStart class MyOtherJob extends Job { ... }
@Every("30s") class MyJob extends Job { ... }
当应用程序处于测试模式时,这些作业正在运行,因此它们也是如此 搞砸了。 如何在测试时禁止它们运行?
我尝试了以下应用程序配置,没有帮助:
# Jobs executor
# ~~~~~~
# Size of the Jobs pool
play.jobs.pool=10
test.play.jobs.pool=0
test.cron.queue.every=never
dev.cron.queue.every=20s
prod.cron.queue.every=20s
test.cron.onApplicationStart.trigger=never
dev.cron.onApplicationStart.trigger=auto
prod.cron.onApplicationStart.trigger=auto
答案 0 :(得分:4)
可以使用以下语法检查Play是否在测试模式下运行。
play.Play.runingInTestMode()
注意:拼写错误不是偶然的。这是API中的方法名称。
因此,在您的作业中,您应该能够使用上述内容围绕IF语句包装作业执行,从而阻止测试模式作业。
答案 1 :(得分:0)
我们有一个很好的小包装器,用于检查是否在特定环境中启用了作业。
application.conf中的示例条目
job.myjob.enabled=true
%test.job.myjob.enabled=false
%prod.job.myjob.enabled=true
等等。
def ifEnabled(property: String)(runnable: => Unit) =
play.conf.configuration.getProperty(property + ".enabled", "false") match {
case "true" => runnable
case _ => Logger info "Ignoring " + property + " since it's disabled!"
}
然后在你的工作中
class MyJob extends Job {
ifEnabled("job.myJob") {
// code goes here
}
}
这样您就不必检查每个环境。
答案 2 :(得分:0)
if (clazz.isAnnotationPresent(Every.class)) {
try {
Job job = (Job) clazz.newInstance();
scheduledJobs.add(job);
String value = job.getClass().getAnnotation(Every.class).value();
if (value.startsWith("cron.")) {
value = Play.configuration.getProperty(value);
}
value = Expression.evaluate(value, value).toString();
if(!"never".equalsIgnoreCase(value)){
executor.scheduleWithFixedDelay(job, Time.parseDuration(value), Time.parseDuration(value), TimeUnit.SECONDS);
}
所以你应该定义cron.myjob = 3min%test.cron.myjob = never and on(" cron.myjob")
例如:
cron.SyncWeixinInfo=never
%prod.cron.SyncWeixinInfo=0 0 0 1 * ?
%test.cron.SyncWeixinInfo=0 0 0 1 * ?
%localtest.cron.SyncWeixinInfo=0 0 0 1 * ?
%prodSlave.cron.SyncWeixinInfo=never
@On("cron.SyncWeixinInfo")//每月1号凌晨0点
public class SyncWeixinInfo extends Job {