package org.skywalking.apm.collector.actor; import akka.actor.ActorRef; import akka.actor.Props; /** * The <code>AbstractClusterWorkerProvider</code> implementations represent providers, * which create instance of cluster workers whose implemented {@link AbstractClusterWorker}. * <p> * * @author pengys5 * @since v3.0-2017 */ public abstract class AbstractClusterWorkerProvider<T extends AbstractClusterWorker> extends AbstractWorkerProvider<T> { /** * Create how many worker instance of {@link AbstractClusterWorker} in one jvm. * * @return The worker instance number. */ public abstract int workerNum(); /** * Create the worker instance into akka system, the akka system will control the cluster worker life cycle. * * @param localContext Not used, will be null. * @return The created worker reference. See {@link ClusterWorkerRef} * @throws IllegalArgumentException Not used. * @throws ProviderNotFoundException This worker instance attempted to find a provider which use to create another * worker instance, when the worker provider not find then Throw this Exception. */ @Override final public WorkerRef onCreate( LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFoundException { int num = ClusterWorkerRefCounter.INSTANCE.incrementAndGet(role()); T clusterWorker = workerInstance(getClusterContext()); clusterWorker.preStart(); ActorRef actorRef = getClusterContext().getAkkaSystem().actorOf(Props.create(AbstractClusterWorker.WorkerWithAkka.class, clusterWorker), role().roleName() + "_" + num); ClusterWorkerRef workerRef = new ClusterWorkerRef(actorRef, role()); getClusterContext().put(workerRef); return workerRef; } }