I have tried looking, without any luck, for some kind of function to kill/interrupt a working Job in the Play! framework.
Am i missing something? or did Play! actually not add this functionality?
There is nothing like the stop
method in the Java Thread
class, which is deprecated for good reasons. The clean way is to have something like an interrupted
boolean. If you extend play.jobs.Job
you can easily add own interrupt
methods the change the jobs state. You can do something like:
ComputeBigPrime primeJob = new ComputeBigPrime();
Promise<Integer> promisedPrime = primeJob.now();
// Timeout for interrupt
await("10s");
primeJob.interrupt();
// Wait until it's really finished to get the result
Integer prime = await(promisedPrime);
render(prime);
If you want to do the interrupt between more than one request, you can use the
play.cache.Cache
and set an unique id (e.g. a UUID) with the information, if the thread is interrupted or not.
Of course this does not work, if you job is hanging in some other API call and you can not use a loop the check the interrupted
boolean, but if you really need to do a hard stop
like in Thread
, you can try to use a Thread
inside you controller or job. As its all just Java it should work.