2017-09-29 57 views
1

我想使用akka actor实施CRUD操作。我是一个新的阿卡,所以不知道阿卡演员的设计基础。如何扩展超级演员在akka中的行为

我想分享多个子角色中的akka​​角色的行为。

我想保存并删除学生,老师和其他实体的杉木例子。

我已经创建了男演员StudentDao.scala

class StudentDao extends Actor with ActorLogging{ 

override def Receive = { 

    case Add(student) => 
     // Add to database 
    case Delete => 
     //Delete from database  
    // Some other cases related to Student entity 
    } 
} 
case object StudentDao{ 
    case class Add(user : Student) 
    case class Delete(id : String) 
} 

同我有演员的TeacherDao.scala

class TeacherDao extends Actor with ActorLogging{ 

override def Receive = { 

    case Add(teacher) => 
     // Add to database 
    case Delete => 
     //Delete from database  
    // Some other cases related to teacher entity 

    } 
} 

object TeacherDao{ 
    case class Add(user : teacher) 
    case class Delete(id : String) 
} 

我想两个DAO抽象的删除方法。 所以我要创建BaseDao.scala

class BaseDao extends Actor with ActorLogging{ 

    override def Receive = { 

    case Delete => 
     //Delete from database dao.delete 
    } 

我怎么能抽象的使用基本演员。

回答

0

您可以创建基本演员一个特点,具有共同的接收功能orElse另外一个有子者,以实现:

trait BaseActor extends Actor { 

    override def receive: Receive = commonReceive orElse handleReceive 

    def commonReceive: Receive = { 
    case CommonMessage => // do something 
    } 

    def handleReceive: Receive 
} 

然后你的子参与者只需要执行handleReceive:

class SubActor extends BaseActor { 

    override def handleReceive: Receive = { 
    case SpecificMessage => // do something 
    } 
} 
1

orElse是延长演员的行为方式,因为一个演员的Receive简直是PartialFunction[Any, Unit]的别名。以下是您的使用案例的具体说明。

首先,定义必须与演员混合的特征中的基本行为。为避免重复,请将Delete案例类移入此特征的伴随对象。

trait BaseDao { this: Actor with ActorLogging => 
    import BaseDao._ 

    def baseBehavior: Receive = { 
    case Delete(id) => 
     log.info(s"Deleting $id from db") 
     // delete from db 
    } 
} 

object BaseDao { 
    case class Delete(id: String) 
} 

然后,混合上述特质到您的其他演员和链orElse行为。请注意,我创建了虚拟StudentTeacher个案类,以便编译此代码。 StudentDao

class StudentDao extends Actor with ActorLogging with BaseDao { 
    import StudentDao._ 

    def studentBehavior: Receive = { 
    case Add(student) => 
     log.info(s"Adding student: $student") 
    // some other cases related to Student 
    } 

    def receive = studentBehavior orElse baseBehavior 
} 

object StudentDao { 
    case class Add(user: Student) 
} 
case class Student(name: String) 

而且TeacherDao

class TeacherDao extends Actor with ActorLogging with BaseDao { 
    import TeacherDao._ 

    def teacherBehavior: Receive = { 
    case Add(teacher) => 
     log.info(s"Adding teacher: $teacher") 
    // some other cases related to Teacher 
    } 

    def receive = teacherBehavior orElse baseBehavior 
} 

object TeacherDao { 
    case class Add(user: Teacher) 
} 
case class Teacher(name: String)