2016-07-04 10 views
1

プレイ2.5でスケジュールされたタスクを作成します。私はこのトピックに関連するいくつかのリソースを見つけましたが、どれもPlay 2.5のものではありませんでした。私が探しているものに関連するthis resourceが見つかりました。また、同じリンクに2.4から2.5の移行ガイドがあります。スケーラでスケジュールされたタスクをプレイ2.5で作成する

古いバージョンの例では、GlobalSettingsがベースとして使用されていましたが、2.5では非推奨です。移行ガイドは、この特性を拡張するのではなく、依存性注入を使用する必要があるため、重要です。私はそれを行う方法がわかりません。

ガイダンスを教えてもらえますか?あなたがアッカの俳優の内側sheduledタスクを実行する必要が

+0

参照:http://stackoverflow.com/a/34803018/4600 Play 2.5では基本的に同じことです。 – marcospereira

答えて

5

SchedulerActor.scala

package scheduler 

import javax.inject.{Inject, Singleton} 

import akka.actor.Actor 
import org.joda.time.DateTime 
import play.api.Logger 

import scala.concurrent.ExecutionContext 

@Singleton 
class SchedulerActor @Inject()()(implicit ec: ExecutionContext) extends Actor { 
    override def receive: Receive = { 
    case _ => 
     // your job here 
    } 
} 

Scheduler.scala

package scheduler 

import javax.inject.{Inject, Named} 

import akka.actor.{ActorRef, ActorSystem} 
import play.api.{Configuration, Logger} 

import scala.concurrent.ExecutionContext 
import scala.concurrent.duration._ 

class Scheduler @Inject() (val system: ActorSystem, @Named("scheduler-actor") val schedulerActor: ActorRef, configuration: Configuration)(implicit ec: ExecutionContext) { 
    val frequency = configuration.getInt("frequency").get 
    var actor = system.scheduler.schedule(
    0.microseconds, frequency.seconds, schedulerActor, "update") 

} 

JobModule.scala

package modules 

import com.google.inject.AbstractModule 
import play.api.libs.concurrent.AkkaGuiceSupport 
import scheduler.{Scheduler, SchedulerActor} 

class JobModule extends AbstractModule with AkkaGuiceSupport { 
    def configure() = { 
    bindActor[SchedulerActor]("scheduler-actor") 
    bind(classOf[Scheduler]).asEagerSingleton() 
    } 
} 

application.conf

play.modules.enabled += "modules.JobModule" 
+0

私にとっては、これは残念ながらローカルでしか動作しません。アプリケーションを 'sbt stage'でパッケージ化してサーバにデプロイすると、起動しません:'おっと、サーバを起動できません。モジュールをロードできません。[...] '原因:java.lang.ClassNotFoundException:modules.JobModule'。何か不足していますか?助けてくれてありがとう。 – Nick

+0

私はsbtネイティブパッケージャでビルドされたパッケージでのみテストしましたが、それは魅力的です。私は週末にあなたの問題を調べるつもりです。 – mgosk

+0

あなたのソリューションは実際に本番環境でも動作します。 Azureの自動展開(私はそれが嫌い)に何か問題があったようだ。ありがとうございました!! – Nick

0

あなたがアッカを使用しない場合、あなたは、Javaを使用することができます。

  • はScheduledFuture
  • ScheduledExecutorService

DemoDaemon.scala:

import java.util.concurrent.{Executors, ScheduledFuture, TimeUnit} 
import javax.inject._ 
import play.Configuration 
import scala.util.Try 

class DemoDaemon @Inject() (conf: Configuration) { 

    val isEnabled = conf.getBoolean("daemon.enabled") 
    val delay = conf.getLong("daemon.delay") 

    private var scheduledTaskOption : Option[ScheduledFuture[_]] = None 

    def task(): Unit = { 

    Try { 
     println("doSomething") 
    } recover { 
     case e: Throwable => println(e.getMessage) 
    } 
    } 

    def start(): Unit = { 
    if (isEnabled) { 
     val executor = Executors.newScheduledThreadPool(1) 

     scheduledTaskOption = Some( 
     executor.scheduleAtFixedRate(
      new Runnable { 
      override def run() = task() 
      }, 
      delay, delay, TimeUnit.SECONDS 
     ) 
    ) 
    } else { 
     println("not enabled") 
    } 
    } 

    def stop(): Unit = { 
    scheduledTaskOption match { 
     case Some(scheduledTask) => 
     println("Canceling task") 
     val mayInterruptIfRunning = false 
     scheduledTask.cancel(mayInterruptIfRunning) 
     case None => println("Stopped but was never started") 
    } 
    } 
} 

DaemonService.scala

import javax.inject.Inject 
import play.api.inject.ApplicationLifecycle 
import scala.concurrent.Future 

class DaemonService @Inject() (appLifecycle: ApplicationLifecycle, daemon: DemoDaemon) { 

    daemon.start() 

    appLifecycle.addStopHook{() => 
    Future.successful(daemon.stop()) 
    } 
} 

JobModule.scala

import com.google.inject.AbstractModule 

class JobModule extends AbstractModule { 
    def configure(): Unit = { 
    bind(classOf[DaemonService]).asEagerSingleton() 
    } 
} 

application.conf

daemon.enabled = true 
daemon.delay = 10 
play.modules.enabled += "com.demo.daemon.JobModule" 
関連する問題