Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Cách mở rộng xử lý của actor trong akka
Spoiler: đây là note cá nhân của mình khi sử dụng akka.
Khi dùng akka thì cách sử dụng thông thường sẽ là extends Actor class và override lại hàm receive
import akka.actor._
class BaseActor extends Actor {
def receive = {
case Message1() => //do something1
case Message2() => //do something2
}
}
Về cơ bản thì receive được định nghĩa trong Actor object là một PartialFunction
type Receive = PartialFunction[Any, Unit]
Trong một số trường hợp khi các xử lý do something 1 và do something 2 trở nên phức tạp và logic không liên quan đến nhau, bạn muốn chia ra đặt ở các chỗ chứa khác nhau. Chỗ chứa ở đây có thể là 2 class: class 1 và class 2, có thể là trait 1 và trait 2. Tuy nhiên vấn đề ở đây là
Làm sao tách một partial function to ra thành các partial function nhỏ hơn
Để compose các partial function trong scala thì chúng ta dùng hàm orElse
partial1 orElse partial2
Như vậy với trường hợp ở trên chúng ta có thể tách thành các trait nhỏ hơn
trait Message1Op {
def proc1 = {
case Message1 => //do smt
}
}
trait Message2Op {
def proc1 = {
case Message2 => //do smt
}
}
class FooActor extends Actor with Message1Op with Message2Op {
def receive = proc1 orElse proc2
}







