J'utilise quelques services héritant de la AbstractScheduledService
, qui se gérés par un ServiceManager
. Tout fonctionne très bien, mais maintenant, il y a un service qui runOneIteration
prend un temps assez long, et à la suite, mon processus prend trop de temps pour terminer (plus de cinq secondes).
Il existe d' autres services héritant de AbstractExecutionThreadService
, qui a eu un problème similaire, que je pouvais résoudre par
@Override
protected final void triggerShutdown() {
if (thread != null) thread.interrupt();
}
et stocker private volatile thread
dans le run
procédé. Cependant, il n'y a pas triggerShutdown
pour AbstractScheduledService
comme indiqué dans cette question .
Je l' ai déjà envisagé des alternatives comme faire runOneIteration
faire moins de travail, mais il est à la fois laid et inefficace.
Je ne peux pas passer outre stopAsync
qu'il est définitif et je ne vois rien d' autre. Y at - il un crochet pour faire quelque chose comme ça?
Pouvez-vous travailler avec cela? Y avait-il une raison quelconque, vous ne pouviez pas ajouter un triggerShutdown vous?
class GuavaServer {
public static void main(String[] args) throws InterruptedException {
GuavaServer gs = new GuavaServer();
Set<ForceStoppableScheduledService> services = new HashSet<>();
ForceStoppableScheduledService ts = gs.new ForceStoppableScheduledService();
services.add(ts);
ServiceManager manager = new ServiceManager(services);
manager.addListener(new Listener() {
public void stopped() {
System.out.println("Stopped");
}
public void healthy() {
System.out.println("Health");
}
public void failure(Service service) {
System.out.println("Failure");
System.exit(1);
}
}, MoreExecutors.directExecutor());
manager.startAsync(); // start all the services asynchronously
Thread.sleep(3000);
manager.stopAsync();
//maybe make a manager.StopNOW()?
for (ForceStoppableScheduledService service : services) {
service.triggerShutdown();
}
}
public class ForceStoppableScheduledService extends AbstractScheduledService {
Thread thread;
@Override
protected void runOneIteration() throws Exception {
thread = Thread.currentThread();
try {
System.out.println("Working");
Thread.sleep(10000);
} catch (InterruptedException e) {// can your long process throw InterruptedException?
System.out.println("Thread was interrupted, Failed to complete operation");
} finally {
thread = null;
}
System.out.println("Done");
}
@Override
protected Scheduler scheduler() {
return Scheduler.newFixedRateSchedule(0, 1, TimeUnit.SECONDS);
}
protected void triggerShutdown() {
if (thread != null) thread.interrupt();
}
}
}