Package com.droidkit.actors

Source Code of com.droidkit.actors.ActorSystem

package com.droidkit.actors;

import com.droidkit.actors.debug.TraceInterface;
import com.droidkit.actors.mailbox.AbsActorDispatcher;
import com.droidkit.actors.mailbox.ActorDispatcher;

import java.util.HashMap;

/**
* Entry point for Actor Model, creates all actors and dispatchers
*
* @author Stepan Ex3NDR Korshakov (me@ex3ndr.com)
*/
public class ActorSystem {

    private static final ActorSystem mainSystem = new ActorSystem();

    /**
     * Main actor system
     *
     * @return ActorSystem
     */
    public static ActorSystem system() {
        return mainSystem;
    }

    private static final String DEFAULT_DISPATCHER = "default";

    private final HashMap<String, AbsActorDispatcher> dispatchers = new HashMap<String, AbsActorDispatcher>();

    private TraceInterface traceInterface;

    private ClassLoader classLoader;

    /**
     * Creating new actor system
     */
    public ActorSystem() {
        this(true);
    }


    /**
     * Creating new actor system
     */
    public ActorSystem(boolean addDefaultDispatcher) {
        if (addDefaultDispatcher) {
            addDispatcher(DEFAULT_DISPATCHER);
        }
        classLoader = getClass().getClassLoader();
    }

    /**
     * Adding dispatcher with specific threads count
     *
     * @param dispatcherId dispatcher id
     * @param threadsCount threads count
     */
    public void addDispatcher(String dispatcherId, int threadsCount) {
        synchronized (dispatchers) {
            if (dispatchers.containsKey(dispatcherId)) {
                return;
            }
            dispatchers.put(dispatcherId, new ActorDispatcher(dispatcherId, this, threadsCount));
        }
    }

    /**
     * Adding dispatcher with threads count = {@code Runtime.getRuntime().availableProcessors()}
     *
     * @param dispatcherId dispatcher id
     */
    public void addDispatcher(String dispatcherId) {
        addDispatcher(dispatcherId, new ActorDispatcher(dispatcherId, this, Runtime.getRuntime().availableProcessors()));
    }

    /**
     * Registering custom dispatcher
     *
     * @param dispatcherId dispatcher id
     * @param dispatcher   dispatcher object
     */
    public void addDispatcher(String dispatcherId, AbsActorDispatcher dispatcher) {
        synchronized (dispatchers) {
            if (dispatchers.containsKey(dispatcherId)) {
                return;
            }
            dispatchers.put(dispatcherId, dispatcher);
        }
    }

    public <T extends Actor> ActorRef actorOf(ActorSelection selection) {
        return actorOf(selection.getProps(), selection.getPath());
    }

    /**
     * Creating or getting existing actor from actor class
     *
     * @param actor Actor Class
     * @param path  Actor Path
     * @param <T>   Actor Class
     * @return ActorRef
     */
    public <T extends Actor> ActorRef actorOf(Class<T> actor, String path) {
        return actorOf(Props.create(actor), path);
    }

    /**
     * Creating or getting existing actor from actor props
     *
     * @param props Actor Props
     * @param path  Actor Path
     * @return ActorRef
     */
    public ActorRef actorOf(Props props, String path) {
        String dispatcherId = props.getDispatcher() == null ? DEFAULT_DISPATCHER : props.getDispatcher();

        AbsActorDispatcher mailboxesDispatcher;
        synchronized (dispatchers) {
            if (!dispatchers.containsKey(dispatcherId)) {
                throw new RuntimeException("Unknown dispatcherId '" + dispatcherId + "'");
            }
            mailboxesDispatcher = dispatchers.get(dispatcherId);
        }

        return mailboxesDispatcher.referenceActor(path, props);
    }

    /**
     * Getting current trace interface for actor system
     *
     * @return trace interface
     */
    public TraceInterface getTraceInterface() {
        return traceInterface;
    }

    /**
     * Setting current trace interface for actor system
     *
     * @param traceInterface trace interface
     */
    public void setTraceInterface(TraceInterface traceInterface) {
        this.traceInterface = traceInterface;
    }

    /**
     * Getting actor system class loader
     *
     * @return class loader
     */
    public ClassLoader getClassLoader() {
        return classLoader;
    }

    /**
     * Setting actor system class loader
     *
     * @param classLoader class loader
     */
    public void setClassLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }
}
TOP

Related Classes of com.droidkit.actors.ActorSystem

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.