Почему receive.tell (msg, отправитель), а не sender.tell (msg, получатель) в акке? - PullRequest
0 голосов
/ 23 декабря 2019

Я новичок в акке. Может ли кто-нибудь объяснить мне, почему метод сказать определен следующим образом:

receiver.tell(msg, sender);

На мой взгляд, кто-то отправляет сообщение другим людям, в ООП он хотел бы:

sender.tell(msg, receiver)

Отправитель сообщает сообщение получателю

1 Ответ

2 голосов
/ 23 декабря 2019

Позвольте мне попытаться объяснить это на примере.

Раздел 1:

Подумайте об этом как об обмене текстовыми сообщениями между двумя людьми (например, A и B ).

Если A получает сообщение от B , то A is the Receiver и B is the Sender. Предположим, что если A отправляет сообщение, то A becomes the Sender, тогда как B becomes Receiver

Итак, отправитель и получатель действительно зависят от направления потока сообщения. Оба будут выступать в качестве отправителя и получателя.

В соответствии с вашим примером ..

ActorRef, переданный в качестве второго параметра в методе tell(), указывает, кто отправил сообщение, тогда как ActorRef метод tell, который был вызван, является получателем.

Как правило, он Reciever.tell(message, sender) в обоих местах. Но вы можете обозначить это как Sender.tell(msg, receiver) как указание на ответ Актеру, который отправил сообщение в первую очередь.

Даже если вы говорите это как Sender.tell(msg, receiver), здесь Sender часть являетсятот, кто собирается получить сообщение, а Receiver часть - тот, кто фактически отправляет сообщение (отвечая в данном случае).

Попробуйте читать и понимать выше построчно, так как это можеткажется запутанным. Затем продолжите ниже.


Раздел 2:

Теперь, в Reciever.tell(message, sender) отправитель не всегда должен быть тем, кто отправил сообщение. Это может указывать и на другого актера. Или у него может не быть актера, просто пройдя ActorRef.noSender().

Теперь рассмотрим три актера A , B & C ,Если я отправлю сообщение от актера A актеру B, как показано ниже,

B.tell(message, C);

В контексте B, C будет тем, кто отправил сообщение B, хотя A был фактическим отправителем. Итак, когда вы отправляете ответ, как показано ниже,

getSender().tell(replyMsg, getSelf());

Здесь, метод getSender() будет возвращать ссылку на актера C вместо актора A. Таким образом, актер C получит ответное сообщение.

Если предположить, что субъект А отправил сообщение без ссылки на отправителя, как показано ниже,

B.tell(message, ActorRef.noSender())

Тогда в контексте Б отправителя не будет. Отправитель неизвестен. Предположим, что если B попытается отправить ответ getSender().tell(replyMsg, getSelf()), то никакие действующие лица (A, B, C) не получат сообщение , но будут доставлены системному действующему субъекту специального типа, известному как deadLetter actor.

...