Scala 2.8Beta1 Актер - PullRequest
       39

Scala 2.8Beta1 Актер

4 голосов
/ 23 февраля 2010

зовет !! метод от одного актера к другому рабочему актеру, кажется, поддерживает канал открытым даже после того, как вызывающий получил ответ (то есть: будущее готово).

Например, используя !! отправка 11 разных сообщений от одного актера другому рабочему актеру приведет к тому, что в почтовом ящике исходного абонента будет показано 11 сообщений, аналогичных приведенным ниже, каждое из которых имеет другое значение Channel @ xxxx.

! (Scala.actors.Channel @ 11b456f, выход (com.test.app.actor.QueryActor @ 4f7bc2, "нормальный))

Ожидают ли эти сообщения ответа от работника, так как исходный вызывающий абонент отправляет сообщение Exit по своему собственному вызову exit (), или они генерируются на другом конце, и по какой-то причине имеют печатную форму, показанную выше ? К этому моменту рабочий актер уже вышел, поэтому первоначальный абонент !! определенно никогда не получит никаких ответов.

Такое поведение нежелательно, так как исходный почтовый ящик вызывающего актера заполняется этими сообщениями о выходе (по одному для каждого канала, созданного для каждого использования !!).

Как это можно остановить? Является ли первоначальный вызывающий абонент автоматически "связывающим" с каналами ответа, созданными на каждом !! звоните

1 Ответ

5 голосов
/ 24 февраля 2010

Причина, по которой эти сообщения Exit отправляются исходному вызывающему, заключается в том, что вызывающий связывает свой временный канал, который используется для получения будущего результата, к вызываемому. В частности, если канал получает сигнал выхода, по этому каналу отправляется сообщение Exit, в результате чего сообщение, аналогичное тому, которое вы описываете, отправляется фактическому вызывающему абоненту (каналы можно рассматривать как теги сообщений). Это сделано для того, чтобы разрешить (повторно) выдать исключение внутри вызывающей стороны, если вызываемый абонент завершает работу перед передачей будущей отправки сообщения (исключение выдается при обращении к будущему).

Проблема с текущей реализацией заключается в том, что вызывающая сторона получает сообщение Exit, даже если будущее уже разрешено. Это явно ошибка, которая должна быть зарегистрирована на Scala Trac. Возможное решение - отправить сообщение о выходе только в том случае, если будущее еще не решено. В этом случае сообщение «Выход» будет удалено при каждом первом обращении к будущему с использованием apply или isSet.

...