2012-11-13 24 views
6

Bất cứ khi nào một diễn viên nhận được một tin nhắn trong scala, chúng ta có thể truy cập người gửi của tác nhân bằng cách sử dụng một từ khóa 'người gửi' là một đối tượng của đặc tính AbstractActor.Từ nơi chúng tôi nhận được diễn viên người gửi khi nhận được một tin nhắn cụ thể?

Câu hỏi của tôi làm cách nào để 'người gửi' này có thể truy cập được bất cứ khi nào nhận được tin nhắn.

và cũng có thể, chúng tôi có thể ghi đè triển khai này cùng với người gửi một số dữ liệu khác cũng có thể truy cập như ipaddress, cổng từ nơi dữ liệu đến.

Theo tôi biết, không có cách nào bạn có thể nhận ipaddress và cổng từ nơi thư đã đến .. Có cách nào để chúng tôi có thể lấy ipaddress của người gửi và số cổng từ đối tượng 'người gửi' này không?

Cảm ơn sự giúp đỡ.

+0

Nếu địa chỉ IP là một phần của thư, có thể bạn nên đặt nó vào thư? –

Trả lời

1

Trong hệ thống diễn viên AKKA,! bị quá tải là def! (message: scala.Any) (người gửi ngầm: akka.actor.ActorRef) trong đó người gửi là diễn viên đã gửi thư. Sau đó bạn có thể gọi phương thức đường dẫn trên ActorRef, nhưng tôi không nghĩ rằng bạn sẽ có thể nhận được địa chỉ IP thực từ đó.

5

(Bạn đã không thực sự nói trước với các diễn viên, vì vậy tôi giả sử một câu trả lời Akka là okay cũng)

Phương pháp sender mang đến cho bạn ActorRef đó là ngầm hay rõ ràng nhặt tại địa điểm gửi: nếu bạn sử dụng ! trong một diễn viên, số implicit val self: ActorRef của nó được tìm thấy và sử dụng. Nếu đó là cuộc sống người gửi trong một ActorSystem khác với người nhận, tức là nó là một gửi thông điệp từ xa, sau đó các sender ref sẽ chứa tất cả thông tin cần thiết để trả lời, chỉ cần nhìn vào đường đi của nó:

val s = sender // Actor[akka://<system>@<host>:<port>/user/path/to/actor] 
val p = s.path // akka://<system>@<host>:<port>/user/path/to/actor 
val a = p.address // akka://<system>@<host>:<port> 
val host = a.host // Some(<host>), where <host> is the listen address as configured for the remote system 
val port = a.port // Some(<port>), where <port> is the actual listen port of the remote system 

Vì vậy, trong ngắn hạn, sender.path.address.host (và analog cho cổng) sẽ cung cấp cho bạn những gì bạn cần.

+1

Thật không may tôi không sử dụng akka ... Bạn có biết làm thế nào điều này có thể được thực hiện trong scala diễn viên? ... Cảm ơn sự giúp đỡ anyway ... – user1822249

+3

Tôi chưa bao giờ sử dụng remoting với scala.actors, nhưng từ những gì tôi nghe bạn có thể quan tâm đến việc tìm kiếm Akka, nó là một giải pháp được ngành công nghiệp chứng minh. scala.actors.remote đã không được xúc động kể từ tháng 7 năm 2009 (không kể tính năng tái cấu trúc thư viện scala chung), vì vậy tôi nghĩ rằng nó là công bằng để nói rằng nó là unmaintained. –

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