2012-11-05 34 views
5

Tôi đang sử dụng Akka để kiểm soát quyền truy cập vào các quy trình hệ thống đang chạy.Ở Akka, tôi có thể giả mạo một thông điệp từ một diễn viên khác không?

Tôi có một CommandActor duy nhất xử lý các yêu cầu lệnh đến từ bất kỳ tác nhân nào trong hệ thống (cho phép gọi nó là RequestActor) và cho mỗi yêu cầu mới, CommandActor sinh ra một diễn viên CmdChildWorker riêng để xử lý yêu cầu cụ thể đó. CommandActor cũng giới hạn số lượng CmdChildWorkers và gán một id duy nhất cho mỗi yêu cầu, do đó nó phức tạp hơn một bộ định tuyến đơn giản.

Khi lệnh hoàn thành và định kỳ trong quá trình thực hiện quy trình hệ thống, các tác nhân CmdChildWorker gửi các bản cập nhật định kỳ về lại RequestActor ban đầu (ví dụ: quá trình đầu ra cho đến nay).

Tuy nhiên, để duy trì một thiết kế rõ ràng, tôi đã hy vọng rằng tôi có thể giữ cho CmdChildWorker ẩn hoàn toàn khỏi RequestActor ban đầu, với giao diện duy nhất của nó là đến một CommandActor duy nhất. Rõ ràng, tôi có thể gửi bất kỳ tin nhắn trả lời từ CmdChildWorker trở lại thông qua CommandActor, nhưng tôi đã tự hỏi nếu có thể trả lời lại RequestActor trực tiếp từ CmdChildWorker mà không phải định tuyến thông báo qua CommandActor, nhưng vẫn còn giả vờ rằng tin nhắn đã được gửi lại từ CommandActor.

I.e. Tôi muốn giả mạo địa chỉ người gửi của tác nhân CmdChildWorker là địa chỉ của diễn viên chính. Điều này có thể không? Và có lẽ quan trọng hơn là thiết kế diễn viên hợp lý hay tốt này?

Cảm ơn

Trả lời

9

Xem phương pháp tell trên diễn viên. Khi CommandActor chuyển tiếp thông điệp của mình, hãy gọi:

childActor.tell(msg, sender)

và childActor sẽ phải gửi nó như là người gửi ban đầu.

+0

Cảm ơn! Điều đó trả lời như thế nào. Bạn có quan điểm liệu đây có phải là thiết kế diễn viên giỏi không? –

+0

"tốt" là khó nói, vì ai đó luôn có thể đưa ra một cái gì đó tốt hơn, nhưng tôi sẽ không nói nó xấu cả. Trong thực tế, đây là sức mạnh của mô hình diễn viên không định dạng. Đi với nó cho đến khi nó không còn tuyệt vời nữa. –

+1

Bạn nên xem một số diễn viên trình bày mẫu. Việc truyền thông điệp cho người lao động thông qua 'tell' với người gửi khác là cách khá phổ biến để đính kèm" trạng thái "vào giao dịch. Bạn về cơ bản xây dựng một diễn viên để nhớ "tình trạng phiên" và vượt qua anh ta tất cả các thông tin. Anh ta chịu trách nhiệm trả lời truy vấn ban đầu. Tôi muốn nói đó là một mô hình tốt :) – jsuereth

4

Nếu tôi hiểu chính xác yêu cầu của bạn, bạn nên sử dụng chuyển tiếp. Từ tài liệu:

Bạn có thể chuyển tiếp thư từ một diễn viên này đến diễn viên khác. Điều này có nghĩa rằng địa chỉ người gửi ban đầu/tham chiếu được duy trì mặc dù thông điệp đang trải qua một 'người hòa giải'. Điều này có thể hữu ích khi viết diễn viên mà làm việc như router, tải cân bằng, bộ sao, vv

myActor.forward (message)

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