2016-12-09 3 views
0

У меня есть актер, который может быть в нескольких состояниях. Исходное состояние должно быть передано из-за пределов:Как реализовать функцию приема за пределами действия актера и передать ее актеру

class MyActor(openId: String, initialState: Receive) extends Actor { 

    val connected: (String) => Receive = (openId: String) => { 
    case AuthorizedOk(user) => context.become(authorized(user)) 
    ... 
    case message => unhandled(message) 
    } 

    val authorized: (IUserInfo) => Receive = (user: IUserInfo) => { 
    case SomeLogic => context.become(...) 
    case message => unhandled(message) 
    } 

    def receive: Actor.Receive = initialState 
} 

Мне нужно установить начальное состояние connected или authorized в конструкторе. Конечно, это может быть какая-то другая функция. Но я не понимаю, как достичь этого:

new MyActor("id", ???) 

ответ

2

Я вижу две возможности

  1. ли государство, передаваемой в метод жизненного цикла предстартового актера

или

  1. Имейте объект-компаньон, который может использоваться для передачи состояния при инициализации экземпляра актера , Что-то в линиях:

    объект MyActor {

    Защиту реквизита (InitialState: YourState) = Props.actorOf (новый MyActor (InitialState))

    }

Кроме того, начальная состояние в вашем примере не обязательно должно быть частичной функцией. Вы могли бы моделировать это как класс case и просто использовать context.become для перемещения между государствами по мере их развития.

EDIT: добавление примера, чтобы быть более понятным!

sealed trait State 
case object Authorized extends State 
case object UnAuthorized extends State 

class MyActor(state: State) extends Actor { 
    def receive: Receive = { 
    case state: State => 
    // do some logic 
    val newState = someLogic(state) 
    // evolve with the new state 
    context.become(active(newState)) 
    } 

    def active(newState: State): Receive = { 
    // do the pattern matching on the state and evolve 
    } 

    override def preStart(): Unit = { 
    super.preStart() 
    // send the initial state to this actor 
    self ! state 
    } 
} 
+0

Благодарим за сообщение. Моя проблема, что я не понимаю (новичок в scala), как реализовать функцию приема вне сферы действия актера, поэтому я могу передать ее актеру. Некоторые примеры были бы хороши! – zella

+1

Зачем вам это нужно? Функция приема - это функция класса Actor, которую вам необходимо переопределить при расширении актера. И, кроме того, ссылка Actor, которую вы получаете, является просто прокси-сервером для основного экземпляра Actor, поэтому вы не сможете называть свои методы или поля, как у вас на вашем примере (авторизованные, связанные) как таковые. – sparkr