Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
co.paralleluniverse.actors.behaviors.Supervisor Maven / Gradle / Ivy
/*
* Quasar: lightweight threads and actors for the JVM.
* Copyright (C) 2013, Parallel Universe Software Co. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 3.0
* as published by the Free Software Foundation.
*/
package co.paralleluniverse.actors.behaviors;
import co.paralleluniverse.actors.Actor;
import co.paralleluniverse.actors.ActorBuilder;
import co.paralleluniverse.actors.ActorRef;
import co.paralleluniverse.actors.LocalActorUtil;
import static co.paralleluniverse.actors.behaviors.RequestReplyHelper.call;
import co.paralleluniverse.fibers.Joinable;
import co.paralleluniverse.fibers.SuspendExecution;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
*
* @author pron
*/
public class Supervisor extends GenBehavior {
Supervisor(ActorRef actor) {
super(actor);
}
public final , M> T addChild(ChildSpec spec) throws SuspendExecution, InterruptedException {
if (isInActor())
return (T) SupervisorActor.currentSupervisor().addChild(spec);
final GenResponseMessage res = call(this, new AddChildMessage(RequestReplyHelper.from(), null, spec));
return (T) ((GenValueResponseMessage) res).getValue();
}
public final , M> T getChild(Object id) throws SuspendExecution, InterruptedException {
if (isInActor())
return SupervisorActor.currentSupervisor().getChild(id);
final GenResponseMessage res = call(this, new GetChildMessage(RequestReplyHelper.from(), null, id));
return (T) ((GenValueResponseMessage) res).getValue();
}
public final boolean removeChild(Object id, boolean terminate) throws SuspendExecution, InterruptedException {
if (isInActor())
return SupervisorActor.currentSupervisor().removeChild(id, terminate);
final GenResponseMessage res = call(this, new RemoveChildMessage(RequestReplyHelper.from(), null, id, terminate));
return ((GenValueResponseMessage) res).getValue();
}
public enum ChildMode {
PERMANENT, TRANSIENT, TEMPORARY
};
public static class ChildSpec {
final String id;
final ActorBuilder, ?> builder;
final ChildMode mode;
final int maxRestarts;
final long duration;
final TimeUnit unit;
final long shutdownDeadline;
public ChildSpec(String id, ChildMode mode, int maxRestarts, long duration, TimeUnit unit, long shutdownDeadline, ActorBuilder, ?> builder) {
this.id = id;
this.builder = builder;
this.mode = mode;
this.maxRestarts = maxRestarts;
this.duration = duration;
this.unit = unit;
this.shutdownDeadline = shutdownDeadline;
}
public ChildSpec(String id, ChildMode mode, int maxRestarts, long duration, TimeUnit unit, long shutdownDeadline, ActorRef> actor) {
this(id, mode, maxRestarts, duration, unit, shutdownDeadline, LocalActorUtil.toActorBuilder(actor));
}
public Object getId() {
return id;
}
public ActorBuilder, ?> getBuilder() {
return builder;
}
public ChildMode getMode() {
return mode;
}
public int getMaxRestarts() {
return maxRestarts;
}
public long getDuration() {
return duration;
}
public TimeUnit getDurationUnit() {
return unit;
}
public long getShutdownDeadline() {
return shutdownDeadline;
}
@Override
public String toString() {
return "ChildSpec{" + "builder: " + builder + ", mode: " + mode + ", maxRestarts: " + maxRestarts + ", duration: " + duration + ", unit: " + unit + ", shutdownDeadline: " + shutdownDeadline + '}';
}
}
///////// Messages
static class AddChildMessage extends GenRequestMessage {
final ChildSpec spec;
public AddChildMessage(ActorRef from, Object id, ChildSpec info) {
super(from, id);
this.spec = info;
}
@Override
protected String contentString() {
return super.contentString() + " spec: " + spec;
}
}
static class GetChildMessage extends GenRequestMessage {
final Object name;
public GetChildMessage(ActorRef from, Object id, Object name) {
super(from, id);
this.name = name;
}
@Override
protected String contentString() {
return super.contentString() + " name: " + name;
}
}
static class RemoveChildMessage extends GenRequestMessage {
final Object name;
final boolean terminate;
public RemoveChildMessage(ActorRef from, Object id, Object name, boolean terminate) {
super(from, id);
this.name = name;
this.terminate = terminate;
}
@Override
protected String contentString() {
return super.contentString() + " name: " + name + " terminate: " + terminate;
}
}
static final class Local extends Supervisor implements LocalBehavior {
Local(ActorRef actor) {
super(actor);
}
@Override
public Supervisor writeReplace() throws java.io.ObjectStreamException {
return new Supervisor(ref);
}
@Override
public Actor build() {
return ((ActorBuilder) ref).build();
}
@Override
public void join() throws ExecutionException, InterruptedException {
((Joinable) ref).join();
}
@Override
public void join(long timeout, TimeUnit unit) throws ExecutionException, InterruptedException, TimeoutException {
((Joinable) ref).join(timeout, unit);
}
@Override
public Void get() throws ExecutionException, InterruptedException {
return ((Joinable) ref).get();
}
@Override
public Void get(long timeout, TimeUnit unit) throws ExecutionException, InterruptedException, TimeoutException {
return ((Joinable) ref).get(timeout, unit);
}
@Override
public boolean isDone() {
return ((Joinable) ref).isDone();
}
}
}