akka.actor.OneForOneStrategy Scala Examples
The following examples show how to use akka.actor.OneForOneStrategy.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: Controller.scala From eclair with Apache License 2.0 | 5 votes |
package fr.acinq.eclair.tor import java.net.InetSocketAddress import akka.actor.{Actor, ActorLogging, OneForOneStrategy, Props, SupervisorStrategy, Terminated} import akka.io.{IO, Tcp} import akka.util.ByteString import scala.concurrent.ExecutionContext class Controller(address: InetSocketAddress, protocolHandlerProps: Props) (implicit ec: ExecutionContext = ExecutionContext.global) extends Actor with ActorLogging { import Controller._ import Tcp._ import context.system IO(Tcp) ! Connect(address) def receive = { case e@CommandFailed(_: Connect) => e.cause match { case Some(ex) => log.error(ex, "Cannot connect") case _ => log.error("Cannot connect") } context stop self case c: Connected => val protocolHandler = context actorOf protocolHandlerProps protocolHandler ! c val connection = sender() connection ! Register(self) context watch connection context become { case data: ByteString => connection ! Write(data) case CommandFailed(w: Write) => // O/S buffer was full protocolHandler ! SendFailed log.error("Tor command failed") case Received(data) => protocolHandler ! data case _: ConnectionClosed => context stop self case Terminated(actor) if actor == connection => context stop self } } // we should not restart a failing tor session override val supervisorStrategy = OneForOneStrategy(loggingEnabled = true) { case _ => SupervisorStrategy.Escalate } } object Controller { def props(address: InetSocketAddress, protocolHandlerProps: Props)(implicit ec: ExecutionContext = ExecutionContext.global) = Props(new Controller(address, protocolHandlerProps)) case object SendFailed }
Example 2
Source File: ConsumerRecovery.scala From scala-kafka-client with MIT License | 5 votes |
package cakesolutions.kafka.examples import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, OneForOneStrategy, Props, SupervisorStrategy} import cakesolutions.kafka.KafkaConsumer import cakesolutions.kafka.akka.KafkaConsumerActor.{Confirm, Subscribe} import cakesolutions.kafka.akka.{ConsumerRecords, Extractor, KafkaConsumerActor} import com.typesafe.config.{Config, ConfigFactory} import org.apache.kafka.clients.consumer.OffsetResetStrategy import org.apache.kafka.common.serialization.StringDeserializer import scala.concurrent.duration._ override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10) { case _: KafkaConsumerActor.ConsumerException => log.info("Consumer exception caught. Restarting consumer.") SupervisorStrategy.Restart case _ => SupervisorStrategy.Escalate } val recordsExt: Extractor[Any, ConsumerRecords[String, String]] = ConsumerRecords.extractor[String, String] val consumer: ActorRef = context.actorOf( KafkaConsumerActor.props(kafkaConfig, actorConfig, self) ) consumer ! Subscribe.AutoPartition(List("topic1")) override def receive: Receive = { // Records from Kafka case recordsExt(records) => processRecords(records.pairs) sender() ! Confirm(records.offsets, commit = true) } private def processRecords(records: Seq[(Option[String], String)]) = records.foreach { case (key, value) => log.info(s"Received [$key,$value]") } }
Example 3
Source File: SupervisorStrategies.scala From coral with Apache License 2.0 | 5 votes |
package io.coral.actors import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy.Resume import akka.event.LoggingAdapter import io.coral.utils.Utils object SupervisorStrategies { def logAndContinue(log: LoggingAdapter) = OneForOneStrategy() { case e: Exception => { log.error(s"Caught exception: ${e.getMessage}") log.error(Utils.stackTraceToString(e)) log.info("Continue running due to supervisor strategy 'Resume'.") Resume } } }
Example 4
Source File: AkkaActorsKafkaConsumer.scala From kafka-scala-api with Apache License 2.0 | 5 votes |
package com.example import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, OneForOneStrategy, Props, SupervisorStrategy} import cakesolutions.kafka.KafkaConsumer import cakesolutions.kafka.akka.KafkaConsumerActor.{Confirm, Subscribe} import cakesolutions.kafka.akka.{ConsumerRecords, Extractor, KafkaConsumerActor} import scala.concurrent.duration._ object AkkaActorsKafkaConsumer extends App { ConsumerRecovery() } object ConsumerRecovery { def apply(): ActorRef ={ val actorConf = KafkaConsumerActor.Conf(1.seconds, 3.seconds) val system = ActorSystem() system.actorOf(Props(new ConsumerRecovery(kafkaConsumerConf, actorConf))) } } class ConsumerRecovery(kafkaConfig: KafkaConsumer.Conf[String, String], actorConfig: KafkaConsumerActor.Conf) extends Actor with ActorLogging { override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10) { case _: KafkaConsumerActor.ConsumerException => log.info("Consumer exception caught. Restarting consumer.") SupervisorStrategy.Restart case _ => SupervisorStrategy.Escalate } val recordsExt: Extractor[Any, ConsumerRecords[String, String]] = ConsumerRecords.extractor[String, String] val consumer: ActorRef = context.actorOf( KafkaConsumerActor.props(kafkaConfig, actorConfig, self) ) consumer ! Subscribe.AutoPartition(List(topic)) override def receive: Receive = { // Consume from Kafka case recordsExt(records) => processRecords(records.pairs) sender() ! Confirm(records.offsets, commit = true) } private def processRecords(records: Seq[(Option[String], String)]) = records.foreach { case (key, value) => log.info(s"Received [$key,$value]") } }
Example 5
Source File: IssuesActor.scala From BacklogMigration-Redmine with MIT License | 5 votes |
package com.nulabinc.backlog.r2b.exporter.actor import java.util.concurrent.CountDownLatch import akka.actor.SupervisorStrategy.Restart import akka.actor.{Actor, ActorRef, OneForOneStrategy, Props} import akka.routing.SmallestMailboxPool import com.nulabinc.backlog.migration.common.conf.BacklogConfiguration import com.nulabinc.backlog.migration.common.domain.BacklogTextFormattingRule import com.nulabinc.backlog.migration.common.utils.{ConsoleOut, Logging, ProgressBar} import com.nulabinc.backlog.r2b.exporter.core.ExportContext import com.nulabinc.backlog4j.BacklogAPIException import com.osinka.i18n.Messages import scala.concurrent.duration._ private[exporter] class IssuesActor(exportContext: ExportContext, backlogTextFormattingRule: BacklogTextFormattingRule) extends Actor with BacklogConfiguration with Logging { private[this] val strategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 10 seconds) { case e: BacklogAPIException if e.getMessage.contains("429") => Restart case e: BacklogAPIException if e.getMessage.contains("Stream closed") => Restart case e => ConsoleOut.error("Fatal error: " + e.getMessage) logger.error(e.getStackTrace.mkString("\n")) sys.exit(2) } private[this] val limit = exportLimitAtOnce private[this] val allCount = exportContext.issueService.countIssues() private[this] val completion = new CountDownLatch(allCount) private[this] val console = (ProgressBar.progress _)(Messages("common.issues"), Messages("message.exporting"), Messages("message.exported")) private[this] val issuesInfoProgress = (ProgressBar.progress _)(Messages("common.issues_info"), Messages("message.collecting"), Messages("message.collected")) def receive: Receive = { case IssuesActor.Do => val router = SmallestMailboxPool(akkaMailBoxPool, supervisorStrategy = strategy) val issueActor = context.actorOf(router.props(Props(new IssueActor(exportContext, backlogTextFormattingRule)))) (0 until (allCount, limit)) .foldLeft(Seq.empty[Int]) { (acc, offset) => acc concat issueIds(offset) } .map(issues) .foreach(_(issueActor)) completion.await sender() ! IssuesActor.Done } private[this] def issueIds(offset: Int): Seq[Int] = { val params = Map( "offset" -> offset.toString, "limit" -> limit.toString, "project_id" -> exportContext.projectId.value.toString, "status_id" -> "*", "subproject_id" -> "!*" ) val ids = exportContext.issueService.allIssues(params).map(_.getId.intValue()) issuesInfoProgress(((offset / limit) + 1), ((allCount / limit) + 1)) ids } private[this] def issues(issueId: Int)(issueActor: ActorRef): Unit = { issueActor ! IssueActor.Do(issueId, completion, allCount, console) } } private[exporter] object IssuesActor { val name = "IssuesActor" case object Do case object Done }
Example 6
Source File: IssuesActor.scala From BacklogMigration-Redmine with MIT License | 5 votes |
package com.nulabinc.backlog.r2b.mapping.collector.actor import java.util.concurrent.CountDownLatch import akka.actor.SupervisorStrategy.Restart import akka.actor.{Actor, ActorRef, OneForOneStrategy, Props} import akka.routing.SmallestMailboxPool import com.nulabinc.backlog.migration.common.conf.BacklogConfiguration import com.nulabinc.backlog.migration.common.utils.{ConsoleOut, Logging, ProgressBar} import com.nulabinc.backlog.r2b.mapping.collector.core.{MappingContext, MappingData} import com.nulabinc.backlog4j.BacklogAPIException import com.osinka.i18n.Messages import com.taskadapter.redmineapi.bean.User import scala.concurrent.duration._ private[collector] class IssuesActor(mappingContext: MappingContext) extends Actor with BacklogConfiguration with Logging { private[this] val strategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 10 seconds) { case e: BacklogAPIException if e.getMessage.contains("429") => Restart case e: BacklogAPIException if e.getMessage.contains("Stream closed") => Restart case e => ConsoleOut.error("Fatal error: " + e.getMessage) logger.error(e.getStackTrace.mkString("\n")) sys.exit(2) } private[this] val limit: Int = exportLimitAtOnce private[this] val allCount = mappingContext.issueService.countIssues() private[this] val completion = new CountDownLatch(allCount) private[this] val console = (ProgressBar.progress _)(Messages("common.issues"), Messages("message.analyzing"), Messages("message.analyzed")) private[this] val issuesInfoProgress = (ProgressBar.progress _)(Messages("common.issues_info"), Messages("message.collecting"), Messages("message.collected")) def receive: Receive = { case IssuesActor.Do(mappingData: MappingData, allUsers: Seq[User]) => val router = SmallestMailboxPool(akkaMailBoxPool, supervisorStrategy = strategy) val issueActor = context.actorOf(router.props(Props(new IssueActor(mappingContext.issueService, mappingData, allUsers)))) (0 until (allCount, limit)) .foldLeft(Seq.empty[Int]) { (acc, offset) => acc concat issueIds(offset) } .map(issues) .foreach(_(issueActor)) completion.await sender() ! IssuesActor.Done } private[this] def issueIds(offset: Int): Seq[Int] = { val params = Map("offset" -> offset.toString, "limit" -> limit.toString, "project_id" -> mappingContext.projectId.value.toString, "status_id" -> "*", "subproject_id" -> "!*") val ids = mappingContext.issueService.allIssues(params).map(_.getId.intValue()) issuesInfoProgress(((offset / limit) + 1), ((allCount / limit) + 1)) ids } private[this] def issues(issueId: Int)(issueActor: ActorRef) = { issueActor ! IssueActor.Do(issueId, completion, allCount, console) } } private[collector] object IssuesActor { case class Do(mappingData: MappingData, allUsers: Seq[User]) case object Done }
Example 7
Source File: OnlineAction.scala From marvin-engine-executor with Apache License 2.0 | 5 votes |
package org.marvin.executor.actions import akka.Done import akka.actor.SupervisorStrategy._ import akka.actor.{Actor, ActorLogging, ActorRef, OneForOneStrategy, Props, Status} import akka.pattern.{ask, pipe} import akka.util.Timeout import io.grpc.StatusRuntimeException import org.marvin.artifact.manager.ArtifactSaver import org.marvin.executor.actions.OnlineAction.{OnlineExecute, OnlineHealthCheck, OnlineReload} import org.marvin.executor.proxies.EngineProxy.{ExecuteOnline, HealthCheck, Reload} import org.marvin.executor.proxies.OnlineActionProxy import org.marvin.artifact.manager.ArtifactSaver.SaveToLocal import org.marvin.model.{EngineActionMetadata, EngineMetadata} import org.marvin.util.ProtocolUtil import scala.collection.mutable.ListBuffer import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.{Failure, Success} object OnlineAction { case class OnlineExecute(message: String, params: String) case class OnlineReload(protocol: String) case class OnlineHealthCheck() } class OnlineAction(actionName: String, metadata: EngineMetadata) extends Actor with ActorLogging { var onlineActionProxy: ActorRef = _ var artifactSaver: ActorRef = _ var engineActionMetadata: EngineActionMetadata = _ var artifactsToLoad: String = _ implicit val ec = context.dispatcher override def preStart() = { engineActionMetadata = metadata.actionsMap(actionName) artifactsToLoad = engineActionMetadata.artifactsToLoad.mkString(",") onlineActionProxy = context.actorOf(Props(new OnlineActionProxy(engineActionMetadata)), name = "onlineActionProxy") artifactSaver = context.actorOf(ArtifactSaver.build(metadata), name = "artifactSaver") } override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = metadata.onlineActionTimeout milliseconds) { case _: StatusRuntimeException => Restart case _: Exception => Escalate } override def receive = { case OnlineExecute(message, params) => implicit val futureTimeout = Timeout(metadata.onlineActionTimeout milliseconds) log.info(s"Starting to process execute to $actionName. Message: [$message] and params: [$params].") val originalSender = sender ask(onlineActionProxy, ExecuteOnline(message, params)) pipeTo originalSender case OnlineReload(protocol) => implicit val futureTimeout = Timeout(metadata.reloadTimeout milliseconds) log.info(s"Starting to process reload to $actionName. Protocol: [$protocol].") if(protocol == null || protocol.isEmpty){ onlineActionProxy forward Reload() }else{ val splitedProtocols = ProtocolUtil.splitProtocol(protocol, metadata) val futures:ListBuffer[Future[Any]] = ListBuffer[Future[Any]]() for(artifactName <- engineActionMetadata.artifactsToLoad) { futures += (artifactSaver ? SaveToLocal(artifactName, splitedProtocols(artifactName))) } val origSender = sender() Future.sequence(futures).onComplete{ case Success(_) => onlineActionProxy.ask(Reload(protocol)) pipeTo origSender case Failure(e) => { log.error(s"Failure to reload artifacts using protocol $protocol.") origSender ! Status.Failure(e) } } } case OnlineHealthCheck => implicit val futureTimeout = Timeout(metadata.healthCheckTimeout milliseconds) log.info(s"Starting to process health to $actionName.") val originalSender = sender ask(onlineActionProxy, HealthCheck) pipeTo originalSender case Done => log.info("Work Done!") case _ => log.warning(s"Not valid message !!") } }
Example 8
Source File: RareBooks.scala From reactive-application-development-scala with Apache License 2.0 | 5 votes |
package com.rarebooks.library import akka.actor.{Actor, ActorLogging, ActorPath, Address, OneForOneStrategy, Props, RootActorPath, Stash, SupervisorStrategy} import akka.routing.{ActorRefRoutee, RoundRobinRoutingLogic, Router} import scala.concurrent.duration.{Duration, FiniteDuration, MILLISECONDS => Millis} object RareBooks { case object Close case object Open case object Report // val name: String = // "rare-books" // // def pathFor(address: Address): ActorPath = // RootActorPath(address) / "user" / name def props: Props = Props(new RareBooks) } class RareBooks extends Actor with ActorLogging with Stash { import context.dispatcher import RareBooks._ import LibraryProtocol._ override val supervisorStrategy: SupervisorStrategy = { val decider: SupervisorStrategy.Decider = { case Librarian.ComplainException(complain, customer) => customer ! Credit() log.info(s"RareBooks sent customer $customer a credit") SupervisorStrategy.Restart } OneForOneStrategy()(decider orElse super.supervisorStrategy.decider) } private val openDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.open-duration", Millis), Millis) private val closeDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.close-duration", Millis), Millis) private val nbrOfLibrarians: Int = context.system.settings.config getInt "rare-books.nbr-of-librarians" private val findBookDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.librarian.find-book-duration", Millis), Millis) private val maxComplainCount: Int = context.system.settings.config getInt "rare-books.librarian.max-complain-count" var requestsToday: Int = 0 var totalRequests: Int = 0 var router: Router = createLibrarian() context.system.scheduler.scheduleOnce(openDuration, self, Close) protected def createLibrarian(): Router = { var cnt: Int = 0 val routees: Vector[ActorRefRoutee] = Vector.fill(nbrOfLibrarians) { val r = context.actorOf(Librarian.props(findBookDuration, maxComplainCount), s"librarian-$cnt") cnt += 1 ActorRefRoutee(r) } Router(RoundRobinRoutingLogic(), routees) } }
Example 9
Source File: RareBooks.scala From reactive-application-development-scala with Apache License 2.0 | 5 votes |
package com.rarebooks.library import akka.actor.{ Actor, ActorLogging, OneForOneStrategy, Props, Stash, SupervisorStrategy } import akka.routing.{ ActorRefRoutee, Router, RoundRobinRoutingLogic } import scala.concurrent.duration.{ MILLISECONDS => Millis, FiniteDuration, Duration } object RareBooks { case object Close case object Open case object Report def props: Props = Props(new RareBooks) } class RareBooks extends Actor with ActorLogging with Stash { import context.dispatcher import RareBooks._ import RareBooksProtocol._ override val supervisorStrategy: SupervisorStrategy = { val decider: SupervisorStrategy.Decider = { case Librarian.ComplainException(complain, customer) => customer ! Credit() log.info(s"RareBooks sent customer $customer a credit") SupervisorStrategy.Restart } OneForOneStrategy()(decider orElse super.supervisorStrategy.decider) } private val openDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.open-duration", Millis), Millis) private val closeDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.close-duration", Millis), Millis) private val nbrOfLibrarians: Int = context.system.settings.config getInt "rare-books.nbr-of-librarians" private val findBookDuration: FiniteDuration = Duration(context.system.settings.config.getDuration("rare-books.librarian.find-book-duration", Millis), Millis) private val maxComplainCount: Int = context.system.settings.config getInt "rare-books.librarian.max-complain-count" var requestsToday: Int = 0 var totalRequests: Int = 0 var router: Router = createLibrarian() context.system.scheduler.scheduleOnce(openDuration, self, Close) protected def createLibrarian(): Router = { var cnt: Int = 0 val routees: Vector[ActorRefRoutee] = Vector.fill(nbrOfLibrarians) { val r = context.actorOf(Librarian.props(findBookDuration, maxComplainCount), s"librarian-$cnt") cnt += 1 ActorRefRoutee(r) } Router(RoundRobinRoutingLogic(), routees) } }
Example 10
Source File: RestServiceSupervisor.scala From seahorse with Apache License 2.0 | 5 votes |
package ai.deepsense.commons.rest import akka.actor.{Actor, ActorInitializationException, Props} import ai.deepsense.commons.utils.Logging import ai.deepsense.sparkutils.AkkaUtils class RestServiceSupervisor extends Actor with Logging { import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy._ override def receive: Receive = { case (props: Props, name: String) => logger.debug(s"RestServiceSupervisor creates actor '$name': ${props.actorClass()}") sender() ! context.actorOf(props, name) case message => unhandled(message) } override val supervisorStrategy = OneForOneStrategy() { case exception: ActorInitializationException => logger.error("An ActorInitializationException occurred! Terminating!", exception) AkkaUtils.terminate(context.system) Stop } }
Example 11
Source File: Worker.scala From akka-iot-mqtt-v2 with GNU Lesser General Public License v3.0 | 5 votes |
package akkaiot import java.util.UUID import scala.concurrent.duration._ import akka.actor.{ Props, ActorRef, Actor, ActorLogging, ReceiveTimeout, Terminated } import akka.cluster.client.ClusterClient.SendToAll import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy.Stop import akka.actor.SupervisorStrategy.Restart import akka.actor.ActorInitializationException import akka.actor.DeathPactException object Worker { def props(clusterClient: ActorRef, workProcessorProps: Props, registerInterval: FiniteDuration = 10.seconds): Props = Props(classOf[Worker], clusterClient, workProcessorProps, registerInterval) case class WorkProcessed(result: WorkResult) } class Worker(clusterClient: ActorRef, workProcessorProps: Props, registerInterval: FiniteDuration) extends Actor with ActorLogging { import Worker._ import MasterWorkerProtocol._ val workerId = UUID.randomUUID().toString import context.dispatcher val registerTask = context.system.scheduler.schedule(0.seconds, registerInterval, clusterClient, SendToAll("/user/master/singleton", RegisterWorker(workerId))) val workProcessor = context.watch(context.actorOf(workProcessorProps, "work-processor")) var currentWorkId: Option[String] = None def workId: String = currentWorkId match { case Some(workId) => workId case None => throw new IllegalStateException("Not working") } override def supervisorStrategy = OneForOneStrategy() { case _: ActorInitializationException => Stop case _: DeathPactException => Stop case _: Exception => currentWorkId foreach { workId => sendToMaster(WorkFailed(workerId, workId)) } context.become(idle) Restart } override def postStop(): Unit = registerTask.cancel() def receive = idle def idle: Receive = { case WorkIsReady => sendToMaster(WorkerRequestsWork(workerId)) case work @ Work(workId, deviceType, deviceId, state, setting) => log.info("Worker -> Received work request from {}-{} | State {} | Setting {}", deviceType, deviceId, state, setting) currentWorkId = Some(workId) workProcessor ! work context.become(working) } def working: Receive = { case WorkProcessed(result: WorkResult) => log.info("Worker -> Processed work: {}-{} | Work Id {}", result.deviceType, result.deviceId, workId) sendToMaster(WorkIsDone(workerId, workId, result)) context.setReceiveTimeout(5.seconds) context.become(waitForWorkIsDoneAck(result)) case work: Work => log.info("Worker -> ALERT: Worker Id {} NOT AVAILABLE for Work Id {}", workerId, work.workId) } def waitForWorkIsDoneAck(result: WorkResult): Receive = { case Ack(id) if id == workId => sendToMaster(WorkerRequestsWork(workerId)) context.setReceiveTimeout(Duration.Undefined) context.become(idle) case ReceiveTimeout => log.info("Worker -> ALERT: NO ACK from cluster master, retrying ... ") sendToMaster(WorkIsDone(workerId, workId, result)) } override def unhandled(message: Any): Unit = message match { case Terminated(`workProcessor`) => context.stop(self) case WorkIsReady => case _ => super.unhandled(message) } def sendToMaster(msg: Any): Unit = { clusterClient ! SendToAll("/user/master/singleton", msg) } }
Example 12
Source File: TokenizerWrapper.scala From dbpedia-spotlight-model with Apache License 2.0 | 5 votes |
package org.dbpedia.spotlight.db.concurrent import java.io.IOException import java.util.concurrent.TimeUnit import akka.actor.SupervisorStrategy.Restart import akka.actor.{Actor, ActorSystem, OneForOneStrategy, Props} import akka.pattern.ask import akka.routing.SmallestMailboxRouter import akka.util import org.apache.commons.lang.NotImplementedException import org.dbpedia.spotlight.db.model.{StringTokenizer, TextTokenizer} import org.dbpedia.spotlight.model.{Text, Token} import scala.concurrent.Await class TokenizerWrapper(val tokenizers: Seq[TextTokenizer]) extends TextTokenizer { var requestTimeout = 60 val system = ActorSystem() val workers = tokenizers.map { case tokenizer: TextTokenizer => system.actorOf(Props(new TokenizerActor(tokenizer))) }.seq def size: Int = tokenizers.size val router = system.actorOf(Props[TokenizerActor].withRouter( // This might be a hack SmallestMailboxRouter(scala.collection.immutable.Iterable(workers:_*)).withSupervisorStrategy( OneForOneStrategy(maxNrOfRetries = 10) { case _: IOException => Restart }) ) ) implicit val timeout = util.Timeout(requestTimeout, TimeUnit.SECONDS) override def tokenizeMaybe(text: Text) { val futureResult = router ? TokenizerRequest(text) Await.result(futureResult, timeout.duration) } override def tokenize(text: Text): List[Token] = { tokenizeMaybe(text) text.featureValue[List[Token]]("tokens").get } def tokenizeRaw(text: String): Seq[String] = { throw new NotImplementedException() } def close() { system.shutdown() } def getStringTokenizer: StringTokenizer = tokenizers.head.getStringTokenizer } class TokenizerActor(val tokenizer: TextTokenizer) extends Actor { def receive = { case TokenizerRequest(text) => { try { sender ! tokenizer.tokenizeMaybe(text) } catch { case e: NullPointerException => throw new IOException("Could not tokenize.") } } } } case class TokenizerRequest(text: Text)
Example 13
Source File: SyncDaemon.scala From estuary with Apache License 2.0 | 5 votes |
package com.neighborhood.aka.laplace.estuary.core.akkaUtil import akka.actor.SupervisorStrategy.{Restart, Stop} import akka.actor.{Actor, ActorLogging, ActorRef, InvalidActorNameException, OneForOneStrategy, Props} import com.neighborhood.aka.laplace.estuary.bean.exception.other.WorkerInitialFailureException import com.neighborhood.aka.laplace.estuary.core.akkaUtil.SyncDaemonCommand._ import com.neighborhood.aka.laplace.estuary.core.task.Mysql2MysqlSyncTask import scala.util.Try private def startNewTask(prop: Props, name: String): (ActorRef, String) = { context.child(name).fold { val (actor, result) = (context.actorOf(prop, name), s"syncTaskId:$name create success") actor ! ExternalStartCommand //发送启动命令 log.info(s"start task,id:$name,time:${System.currentTimeMillis}") (actor, result) } { actorRef => log.warning(s"syncTaskId:$name has already exists"); (actorRef, s"syncTaskId:$name has already exists") } } override def supervisorStrategy = { OneForOneStrategy() { case InvalidActorNameException(_) => Stop case _: WorkerInitialFailureException => Stop //出现这个异常,说明启动信息和实际加载的类不匹配,应该被停止 case _ => Restart } } } object SyncDaemon { def props = Props(new SyncDaemon) }
Example 14
Source File: AppSupervisor.scala From project-matt with MIT License | 5 votes |
package org.datafy.aws.app.matt.app import akka.actor.Actor import akka.actor.Props import akka.actor.ActorInitializationException import org.elasticsearch.client.transport.NoNodeAvailableException class AppSupervisor extends Actor { import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy._ import scala.concurrent.duration._ override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: NoNodeAvailableException => Restart case _: NullPointerException => Restart case _: IllegalArgumentException => Restart case _: NoSuchElementException => Restart case _: ActorInitializationException => Restart case _: Exception => Escalate } def receive = { case p: Props => sender() ! context.actorOf(p) } }
Example 15
Source File: BackoffOnRestartSupervisor.scala From perf_tester with Apache License 2.0 | 5 votes |
package akka.pattern import scala.concurrent.duration._ import akka.actor._ import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy._ private class BackoffOnRestartSupervisor( val childProps: Props, val childName: String, minBackoff: FiniteDuration, maxBackoff: FiniteDuration, val reset: BackoffReset, randomFactor: Double, strategy: OneForOneStrategy, val replyWhileStopped: Option[Any]) extends Actor with HandleBackoff with ActorLogging { import context._ import BackoffSupervisor._ override val supervisorStrategy = OneForOneStrategy(strategy.maxNrOfRetries, strategy.withinTimeRange, strategy.loggingEnabled) { case ex ⇒ val defaultDirective: Directive = super.supervisorStrategy.decider.applyOrElse(ex, (_: Any) ⇒ Escalate) strategy.decider.applyOrElse(ex, (_: Any) ⇒ defaultDirective) match { // Whatever the final Directive is, we will translate all Restarts // to our own Restarts, which involves stopping the child. case Restart ⇒ if (strategy.withinTimeRange.isFinite() && restartCount == 0) { // If the user has defined a time range for the maxNrOfRetries, we'll schedule a message // to ourselves every time that range elapses, to reset the restart counter. We hide it // behind this conditional to avoid queuing the message unnecessarily val finiteWithinTimeRange = strategy.withinTimeRange.asInstanceOf[FiniteDuration] system.scheduler.scheduleOnce(finiteWithinTimeRange, self, ResetRestartCount(restartCount)) } val childRef = sender() val nextRestartCount = restartCount + 1 if (strategy.maxNrOfRetries >= 0 && nextRestartCount > strategy.maxNrOfRetries) { // If we've exceeded the maximum # of retries allowed by the Strategy, die. log.debug(s"Terminating on restart #{} which exceeds max allowed restarts ({})", nextRestartCount, strategy.maxNrOfRetries) become(receive) stop(self) } else { become(waitChildTerminatedBeforeBackoff(childRef) orElse handleBackoff) } Stop case other ⇒ other } } def waitChildTerminatedBeforeBackoff(childRef: ActorRef): Receive = { case Terminated(`childRef`) ⇒ become(receive) child = None val restartDelay = BackoffSupervisor.calculateDelay(restartCount, minBackoff, maxBackoff, randomFactor) context.system.scheduler.scheduleOnce(restartDelay, self, BackoffSupervisor.StartChild) restartCount += 1 case StartChild ⇒ // Ignore it, we will schedule a new one once current child terminated. } def onTerminated: Receive = { case Terminated(child) ⇒ log.debug(s"Terminating, because child [$child] terminated itself") stop(self) } def receive = onTerminated orElse handleBackoff }
Example 16
Source File: SchemaManagerRouter.scala From schedoscope with Apache License 2.0 | 5 votes |
package org.schedoscope.scheduler.actors import akka.actor.SupervisorStrategy._ import akka.actor.{Actor, ActorInitializationException, ActorRef, OneForOneStrategy, Props} import akka.event.Logging import akka.routing.RoundRobinPool import org.schedoscope.conf.SchedoscopeSettings import org.schedoscope.scheduler.messages._ import org.schedoscope.scheduler.utils.BackOffSupervision import org.schedoscope.schema.RetryableSchemaManagerException import scala.concurrent.duration._ override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = -1) { case _: RetryableSchemaManagerException => Restart case _: ActorInitializationException => Restart case _ => Escalate } override def preStart { metadataLoggerActor = actorOf( MetadataLoggerActor.props(settings.jdbcUrl, settings.metastoreUri, settings.kerberosPrincipal), "metadata-logger") partitionCreatorActor = actorOf( PartitionCreatorActor.props(settings.jdbcUrl, settings.metastoreUri, settings.kerberosPrincipal, self) .withRouter(new RoundRobinPool(settings.metastoreConcurrency)), "partition-creator") } def scheduleTick(managedActor: ActorRef, backOffTime: FiniteDuration) { system.scheduler.scheduleOnce(backOffTime, managedActor, "tick") } def manageActorLifecycle(metaActor: ActorRef) { val slot = settings.backOffSlotTime millis val delay = settings.backOffMinimumDelay millis val backOffTime = metastoreActorsBackOffSupervision.manageActorLifecycle( managedActor = metaActor, backOffSlotTime = slot, backOffMinimumDelay = delay) scheduleTick(metaActor, backOffTime) } def receive = { case "tick" => manageActorLifecycle(sender) case m: CheckOrCreateTables => partitionCreatorActor forward m case a: AddPartitions => partitionCreatorActor forward a case s: SetViewVersion => metadataLoggerActor forward s case l: LogTransformationTimestamp => metadataLoggerActor forward l case g: GetMetaDataForMaterialize => partitionCreatorActor forward g } } object SchemaManagerRouter { def props(settings: SchedoscopeSettings) = (Props(classOf[SchemaManagerRouter], settings)).withDispatcher("akka.actor.schema-manager-dispatcher") }
Example 17
Source File: GlobalPerformer.scala From incubator-retired-iota with Apache License 2.0 | 5 votes |
package org.apache.iota.fey import akka.actor.SupervisorStrategy.Restart import akka.actor.{Actor, ActorLogging, ActorRef, OneForOneStrategy, Props, Terminated} import akka.routing._ import play.api.libs.json.JsObject import scala.collection.mutable.HashMap import scala.concurrent.duration._ protected class GlobalPerformer(val orchestrationID: String, val orchestrationName: String, val globalPerformers: List[JsObject], val ensemblesSpec : List[JsObject]) extends Actor with ActorLogging{ val monitoring_actor = FEY_MONITOR.actorRef var global_metadata: Map[String, Performer] = Map.empty[String, Performer] override def receive: Receive = { case GlobalPerformer.PRINT_GLOBAL => context.actorSelection(s"*") ! FeyGenericActor.PRINT_PATH case Terminated(actor) => monitoring_actor ! Monitor.TERMINATE(actor.path.toString, Utils.getTimestamp) log.error(s"DEAD Global Performers ${actor.path.name}") context.children.foreach{ child => context.unwatch(child) context.stop(child) } throw new RestartGlobalPerformers(s"DEAD Global Performer ${actor.path.name}") case GetRoutees => //Discard case x => log.warning(s"Message $x not treated by Global Performers") } private def loadClazzFromJar(classPath: String, jarLocation: String, jarName: String):Class[FeyGenericActor] = { try { Utils.loadActorClassFromJar(jarLocation,classPath,jarName) }catch { case e: Exception => log.error(e,s"Could not load class $classPath from jar $jarLocation. Please, check the Jar repository path as well the jar name") throw e } } } object GlobalPerformer{ val activeGlobalPerformers:HashMap[String, Map[String, ActorRef]] = HashMap.empty[String, Map[String, ActorRef]] case object PRINT_GLOBAL }
Example 18
Source File: Ingestor.scala From hydra with Apache License 2.0 | 5 votes |
package hydra.core.ingest import akka.actor.{Actor, OneForOneStrategy, SupervisorStrategy} import akka.pattern.pipe import hydra.core.akka.InitializingActor import hydra.core.monitor.HydraMetrics import hydra.core.protocol._ import hydra.core.transport.{AckStrategy, HydraRecord, RecordFactory, Transport} import org.apache.commons.lang3.ClassUtils import scala.concurrent.Future import scala.util.{Success, Try} def validateRequest(request: HydraRequest): Try[HydraRequest] = Success(request) def doValidate(request: HydraRequest): Future[MessageValidationResult] = { Future .fromTry(validateRequest(request)) .flatMap[MessageValidationResult] { r => recordFactory.build(r).map { r => val destination = r.destination val ackStrategy = r.ackStrategy.toString HydraMetrics.incrementGauge( lookupKey = ReconciliationMetricName + s"_${destination}_$ackStrategy", metricName = ReconciliationMetricName, tags = Seq( "ingestor" -> name, "destination" -> destination, "ackStrategy" -> ackStrategy ) ) HydraMetrics.incrementCounter( lookupKey = IngestCounterMetricName + s"_${destination}_$ackStrategy", metricName = IngestCounterMetricName, tags = Seq( "ingestor" -> name, "destination" -> destination, "ackStrategy" -> ackStrategy ) ) ValidRequest(r) } } .recover { case e => InvalidRequest(e) } } override def initializationError(ex: Throwable): Receive = { case Publish(req) => sender ! IngestorError(ex) context.system.eventStream .publish(IngestorUnavailable(thisActorName, ex, req)) case _ => sender ! IngestorError(ex) } def ingest(next: Actor.Receive) = compose(next) override val supervisorStrategy = OneForOneStrategy() { case _ => SupervisorStrategy.Restart } def decrementGaugeOnReceipt( destination: String, ackStrategy: String ): Future[Unit] = { Future { HydraMetrics.decrementGauge( lookupKey = Ingestor.ReconciliationMetricName + s"_${destination}_$ackStrategy", metricName = Ingestor.ReconciliationMetricName, tags = Seq( "ingestor" -> name, "destination" -> destination, "ackStrategy" -> ackStrategy ) ) } } } object Ingestor { val ReconciliationMetricName = "hydra_ingest_reconciliation" val IngestCounterMetricName = "hydra_ingest_message_counter" }
Example 19
Source File: IngestionHandler.scala From hydra with Apache License 2.0 | 5 votes |
package hydra.ingest.services import akka.actor.SupervisorStrategy.Stop import akka.actor.{Actor, ActorRef, OneForOneStrategy, ReceiveTimeout} import akka.http.scaladsl.model.{StatusCode, StatusCodes} import hydra.core.ingest.{HydraRequest, IngestionReport, RequestParams} import hydra.ingest.services.IngestorRegistry.{ FindAll, FindByName, LookupResult } import scala.concurrent.duration.FiniteDuration trait IngestionHandler { this: Actor => def timeout: FiniteDuration def request: HydraRequest //we require an actorref here for performance reasons def registry: ActorRef private val targetIngestor = request.metadataValue(RequestParams.HYDRA_INGESTOR_PARAM) targetIngestor match { case Some(ingestor) => registry ! FindByName(ingestor) case None => registry ! FindAll } override def receive: Receive = { case LookupResult(Nil) => val errorCode = targetIngestor .map(i => StatusCodes .custom(404, s"No ingestor named $i was found in the registry.") ) .getOrElse(StatusCodes.BadRequest) complete(errorWith(errorCode)) case LookupResult(ingestors) => context.actorOf( IngestionSupervisor.props(request, self, ingestors, timeout) ) case report: IngestionReport => complete(report) } override val supervisorStrategy = OneForOneStrategy() { case e: Exception => fail(e) Stop } private def errorWith(statusCode: StatusCode) = { IngestionReport(request.correlationId, Map.empty, statusCode.intValue()) } def complete(report: IngestionReport) def fail(e: Throwable) }
Example 20
Source File: IngestionHandlerGateway.scala From hydra with Apache License 2.0 | 5 votes |
package hydra.ingest.services import akka.actor.SupervisorStrategy.Stop import akka.actor.{OneForOneStrategy, _} import akka.util.Timeout import hydra.core.protocol.{InitiateHttpRequest, InitiateRequest} import scala.concurrent.duration._ class IngestionHandlerGateway(registryPath: String) extends Actor with ActorLogging { private lazy val registry = context.actorSelection(registryPath).resolveOne()(Timeout(10.seconds)) private implicit val ec = context.dispatcher override def receive = { case InitiateRequest(request, timeout, requestorOpt) => val requestor = requestorOpt getOrElse sender ingest( registryRef => DefaultIngestionHandler .props(request, registryRef, requestor, timeout), requestor ) case InitiateHttpRequest(request, timeout, ctx) => val requestor = sender ingest( registryRef => HttpIngestionHandler.props(request, timeout, ctx, registryRef), requestor ) } private def ingest(props: ActorRef => Props, requestor: ActorRef) = { registry .map(registryRef => context.actorOf(props(registryRef))) .recover { case e: Exception => requestor ! e } } override val supervisorStrategy = OneForOneStrategy() { case _ => Stop //stop ingestion IngestionRequestHandler always } } object IngestionHandlerGateway { val GroupName = "ingestion-handlers" def props(registryPath: String) = Props(classOf[IngestionHandlerGateway], registryPath) }
Example 21
Source File: Replica.scala From Principles-of-Reactive-Programming with GNU General Public License v3.0 | 5 votes |
package kvstore import akka.actor.{ OneForOneStrategy, Props, ActorRef, Actor } import kvstore.Arbiter._ import scala.collection.immutable.Queue import akka.actor.SupervisorStrategy.Restart import scala.annotation.tailrec import akka.pattern.{ ask, pipe } import akka.actor.Terminated import scala.concurrent.duration._ import akka.actor.PoisonPill import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy import akka.util.Timeout object Replica { sealed trait Operation { def key: String def id: Long } case class Insert(key: String, value: String, id: Long) extends Operation case class Remove(key: String, id: Long) extends Operation case class Get(key: String, id: Long) extends Operation sealed trait OperationReply case class OperationAck(id: Long) extends OperationReply case class OperationFailed(id: Long) extends OperationReply case class GetResult(key: String, valueOption: Option[String], id: Long) extends OperationReply def props(arbiter: ActorRef, persistenceProps: Props): Props = Props(new Replica(arbiter, persistenceProps)) } class Replica(val arbiter: ActorRef, persistenceProps: Props) extends Actor { import Replica._ import Replicator._ import Persistence._ import context.dispatcher val replica: Receive = { case _ => } }