scala akka 修炼之路1(使用actor实现一个job的并发计算和task失败重启)

本文通过一个示例展示了如何使用Scala Akka框架的Actor系统来实现并发计算任务。在Parent Actor中创建多个Child Actor执行任务,并监听TaskFailure事件以实现任务失败后的重启。每个Child Actor在接收到TaskMessage后会模拟计算过程,并在特定条件下抛出TaskFailure,触发任务重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.yangg.scala.akka.init


import akka.actor.Actor

import akka.actor.Props

import akka.actor.ActorRef

import akka.actor.Terminated

import akka.event.Logging

import akka.actor.ActorSystem

import akka.pattern.ask

import scala.util.Success

import scala.util.Failure

import scala.concurrent.ExecutionContext.Implicits.global

import scala.concurrent.ExecutionContext

import akka.actor.Terminated




case class HeartBeat(taskid:Int,parent:String)

case class TaskFinished(taskid:Int)

case object JobFinished

case object JobStart

case class TaskFailure(taskid:Int)

case class TaskMessage

case class TaskRestartMessage

case class TaskFinishedMessage


class Parent(jobid:String,tasknum:Int) extends Actor{

  val log=Logging(this.context.system,this)

  var tasks=Array[ActorRef]()

  var replySender=this.context.system.deadLetters

  varcount=0;//存在问题 

  def receive={

    case JobStart=>{

       this.replySender=this.context.sender

       tasks=(1 to tasknum).map(id=>this.context.actorOf(Props(new Child(id)))).toArray

       tasks.foreach(actor=>(actor ! TaskMessage))

    }

    case heartBeat:HeartBeat=>{

      println("taskid-0000"+heartBeat.taskid+",finished:"+heartBeat.parent)

    }

    case TaskFinished(taskid)=>{

      println("taskid-0000"+taskid+"finished...")

      this.self ! TaskFinishedMessage

    }

    case Terminated(actor)=>

      println(actor.path.toString()+"stop")

    case TaskFailure(taskid)=>{

      //restart task

      valrestartActor=this.context.actorOf(Props(new Child(taskid*10)))

      restartActor ! TaskRestartMessage

    } 

    case TaskFinishedMessage=>{

      this.count+=1

      if(this.count==tasknum){

        this.replySender ! akka.actor.Status.Success("all task finished")

      }

      println(this.count)

    }

  }

}

class Child(taskid:Int) extends Actor{

  val log=Logging(this.context.system,this)

  def receive={

    case TaskMessage=>{

      Thread.sleep(1000)

      this.context.parent ! HeartBeat(taskid,"10%")

      Thread.sleep(2000)

      this.context.parent ! HeartBeat(taskid,"70%")

      

      //task failed 

      this.context.stop(this.self)

      if(taskid%3==0){

        this.context.parent ! TaskFailure(this.taskid)

        log.info("taskid="+taskid+" task failed")

      }else{

        this.context.parent ! TaskFinished(this.taskid)

      }     

    }

    case TaskRestartMessage=>{

      log.info(taskid+" restart...")

      this.context.parent ! TaskFinished(this.taskid)

    }

  }

}

object StartMoon {

def main(args:Array[String]){

  val system=ActorSystem("actorSystem")

  val jobActor=system.actorOf(Props(new Parent("DataSplit-job",10)),"DataSplitJob")

  val jobListener=ask(jobActor,JobStart)(10000)

  jobListener.onComplete(result => resultmatch{

    case Success(result)=>{

      println("job finished...,message:"+result)

    }

    case Failure(result)=>{

      println("job failed...,message:"+result.getMessage())

    }

  })

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值