2013-12-09 16 views
8

Đây có thể là lỗi cực kỳ đơn giản nhưng tôi không thể làm cho nó hoạt động bình thường. Tôi đang sử dụng akka 2.2.3 để tạo ứng dụng dựa trên diễn viên trong scala.Tạo một diễn viên

Quá trình cài đặt đơn giản như sau:

object Main { 
    def main(args: Array[String]) = { 
    val system = ActorSystem("Test") 
    val discoverer = system.actorOf(Props[Discoverer], "discoverer") 

    implicit val timeout = Timeout(5.seconds) 

    val not = discoverer ? Messages.Find(something) 

    not.onComplete { 
     case Success(va) => println(va) 
     case Failure(err) => println(err) 
    } 
    ... 
    } 
} 

Và nam diễn viên chính

class Discoverer extends Actor { 
    override def preStart() = { 
    val refresher = context.actorOf(Props[Refresher], "refresher") 
    refresher ! Refresh 
    } 

    def receive = { 
    case _ => sender ! Answer 
    } 
} 

Refresher diễn viên

class Refresher extends Actor { 
    ... 
} 

Những gì bạn nên lấy đi từ này là gì của các diễn viên của tôi có các hàm tạo tham số.

Tuy nhiên nếu tôi cố gắng chạy ứng dụng của tôi nó không thành công với

[ERROR] [12/09/2013 13:17:06.893] [Test-akka.actor.default-dispatcher-3] 
[akka://Test/user/discoverer] no matching constructor found on 
    class Discoverer$Refresher for arguments [] 

lỗi của tôi là gì đây? Tôi có nên tạo ra các diễn viên của mình với .actorOf(Props[Class], "actorname") không?

+3

Tôi khá chắc chắn rằng vấn đề là bạn đang sử dụng lớp bên trong cho lớp Refresher. Không thể nói tại sao. –

+1

@ om-nom-nom Đó là vấn đề. Cảm ơn bạn. Tuy nhiên nó sẽ được tốt đẹp để biết lý do tại sao đây là trường hợp. – mgttlinger

Trả lời

11

Nếu bạn muốn thực hiện công việc này với các lớp lồng nhau, bạn sẽ cần phải khởi tạo diễn viên lồng nhau truyền trong tham chiếu đến tác nhân kèm theo như một hàm tạo arg. Lỗi bạn đang thấy đang nói rằng không có hàm xây dựng no-args, vì vậy đó là gợi ý. Các mã để làm cho mọi việc sẽ trông như thế này:

object InnerTest { 
    def main(args: Array[String]) { 
    val sys = ActorSystem("test") 
    sys.actorOf(Props[OuterActor]) 
    } 
} 

class OuterActor extends Actor{ 

    override def preStart = { 
    context.actorOf(Props(classOf[InnerActor], this), "my-inner-actor") 
    } 

    def receive = { 
    case _ => 
    } 

    class InnerActor extends Actor{ 
    def receive = { 
     case _ => 
    } 
    } 
} 

tôi đoán là điều này đã làm với cố gắng để nhanh chóng một lớp bên trong không tĩnh (thông qua phản ánh) mà không đưa ra một tham chiếu đến nó là lớp bên ngoài. Tôi xác định điều này bằng cách đọc qua bài viết này:

https://www.assembla.com/spaces/akka/tickets/3675#/activity/ticket:

+0

Gợi ý tốt, mặc dù giải pháp được trình bày không hoạt động đối với tôi. Tôi đã định nghĩa một phương thức đạo cụ trong đối tượng đồng hành. – Mahdi

1

Refresher là một lớp bên trong của Discoverer, do, nếu bạn muốn tạo một thể hiện của Refresher bạn cần phải làm điều đó trong bối cảnh của một thể hiện của Discoverer.

Hãy ví dụ này:

class A{ 
    class B{} 
} 

tôi có thể làm new A, nhưng new B sẽ trả về lỗi. Tôi phải làm:

val a = new A 
val b = new a.B 

Đó là lý do tại sao akka không thể tạo diễn viên này.

Các vấn đề liên quan