Насколько я понимаю, актеру может быть отправлено сообщение «Зажги и забудь» в стиле!оператор или стиль "Отправь и получи в будущем" с помощью?оператор.Актер, которому передается сообщение через?должен вызвать self.reply, иначе отправитель получит исключение тайм-аута.С другой стороны, актер, которому передается сообщение через!не может иметь self.reply, если сообщение не передается от другого актера.
Мой вопрос заключается в том, должен ли актер знать во время компиляции, будет ли оно вызвано!или же ????Или, если необходимость self.reply может быть определена во время выполнения, как это можно определить?Возможно, задействован self.tryReply, но документация akka, по-видимому, подразумевает, что неудачная попытка ответить является ошибкой, в то время как если отправитель не является актером, это не является ошибкой, чтобы не ответить, если сообщение передано с!
Редактировать:
Вот код:
package akTest
import akka.actor.Actor
object Main1 {
val worker = Actor.actorOf[ak].start()
def main(args: Array[String]) {
val resp = worker ? "Hi"
resp.get
println(resp)
}
}
class ak extends Actor {
def receive = {
case msg:String => {
val response = "Received: " + msg
println(response)
response
}
}
}
Получается Exception in thread "main" akka.dispatch.FutureTimeoutException: Futures timed out after [4995] milliseconds
Поэтому я добавляю self.reply к актеру:
class ak extends Actor {
def receive = {
case msg:String => {
val response = "Received: " + msg
println(response)
self.reply(response)
response
}
}
}
Это изменение исправляет ошибку тайм-аута.Но теперь, если у меня есть Main2, который отправляет сообщение о пожаре и забывании:
object Main2 {
val worker = Actor.actorOf[ak].start()
def main(args: Array[String]) {
val resp = worker ! "Hi"
println(resp)
}
}
, выдается новая ошибка: [ERROR] [2/1/12 2:04 PM] [akka:event-driven:dispatcher:global-1] [LocalActorRef]
No sender in scope, can't reply.
Как мне написать своего актера, чтобы устранить связьмежду его манерой ответа и методом вызова отправителя?Я не хочу иметь 1 версию актера для!а вторая версия для актера? 1022 *