Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scheduling asynchronus tasks in PlayFramework 2.5.X (Java)

We have a Play-Project that uses PlayFramework 2.5.4 and MongoDB. We want to update our database daily. At the moment we check the time everytime we get a Request and update if a day is over. That leads to some Problems:

  1. The current player has to wait a quiet long time until the request finishes
  2. it can happen that there is one day no update (but we want everyday one, even if nothing changes)
  3. we have to modify every request we insert.

So i found already the documentation of AKKA and old stackoverflowquestions (like How to schedule task daily + onStart() in Play 2.0.4?). But the solutions don´t work anymore.

Akka.system().scheduler()

is deprecated

system.scheduler()

gives compilingerrors (from docu) and i dont know if an import is missing or what else. As i know you should use @inject since Version 2.4, but i cant find proper examples on how to use it with schedule or how to use it afterall

Actually all i want to do is call PlayerDBHandler.newDay() every day on the same time.

Thanks for Help

like image 599
Drunken Avatar asked Jun 30 '16 16:06

Drunken


1 Answers

Without seeing the compilation errors, I'm guessing that system isn't defined. Expanding the example from the documentation, something like this should work.

public class SchedulingTask {

    @Inject
    public SchedulingTask(final ActorSystem system,
                          @Named("update-db-actor") ActorRef updateDbActor) {
        system.scheduler().schedule(
            Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
            Duration.create(1, TimeUnit.DAYS),     //Frequency
            updateDbActor,
            "update",
            system.dispatcher(),
            null);
    }
}

system is injected, and you can also inject a reference to the actor. Alternatively, you can look up the actor ref from system.

Once you've adapted this to do what you want, declare SchedulingTask in a module.

package com.example;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;

public class MyModule extends AbstractModule implements AkkaGuiceSupport {
    @Override
    protected void configure() {
        bindActor(UpdateDbActor.class, "update-db-actor");
        bind(SchedulingTask.class).asEagerSingleton();
    }
}

Finally, update your application conf to enable the module.

play.modules.enabled += "com.example.MyModule"
like image 166
Steve Chaloner Avatar answered Sep 22 '22 08:09

Steve Chaloner