2017-09-29 4 views
1

akka 액터를 사용하여 CRUD 연산을 구현하고 싶습니다. 나는 akka의 새로운 개념이므로 akka 배우의 기본 설계를 모릅니다.akka에서 수퍼 액터의 동작을 확장하는 방법

여러 하위 액터에서 akka 배우의 행동을 공유하고 싶습니다.

전나무 나는 학생, 교사 및 다른 실체를 저장하고 지우고 싶습니다.

나는 두 DAO 추상 삭제 방법 원하는 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) 
} 

에 대한 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) 
} 

같은 내가 배우를위한 배우를 만들었습니다. 그래서 내가

class BaseDao extends Actor with ActorLogging{ 

    override def Receive = { 

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

내가 어떻게 추상적 사용하여 기본 배우 BaseDao.scala

을 만들 수 있습니다.

당신은 공통으로, 기본 배우의 특성을 생성 할 수 있습니다

답변

0

다른 하위 배우에서 구현 될 필요가 있습니다 하나의 기능 orElse가 나타납니다

trait BaseActor extends Actor { 

    override def receive: Receive = commonReceive orElse handleReceive 

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

    def handleReceive: Receive 
} 

다음 서브 배우 만 handleReceive을 구현해야한다 :

배우의 Receive 단순히 PartialFunction[Any, Unit]의 별칭이기 때문에
class SubActor extends BaseActor { 

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

orElse 는, 배우의 행동을 확장하는 방법입니다. 아래는 유스 케이스에 대한 구체적인 예입니다.

먼저 액터와 혼합되어야하는 특성에서 기본 동작을 정의하십시오. 중복을 피하려면 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와 행동에 위의 특성에 섞는다. 이 코드가 컴파일되도록 dummy 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) 
관련 문제