Я создал систему akka. Предположим, что в нем есть несколько действующих лиц. Как я могу печатать всех актеров из системы akka с их путем? (для целей отладки)Как печатать всех актеров в системе акка?
ответ
This reply by Roland Kuhn предполагает, что это не совсем тривиальная проблема, но вы можете получить довольно близко (для актеров, которые будут отвечать на сообщения в разумные сроки), используя протокол запроса-ответа , который все участники подчиниться.
Некоторые непроверенный код выброшены вместе, чтобы проиллюстрировать идею:
import akka.actor._
class IdentifyingActor extends Actor with ActorLogging {
def receive = {
case 'start =>
self ! ActorPath.fromString("/user")
case path: ActorPath =>
context.actorSelection(path/"*") ! Identify(())
case ActorIdentity(_, Some(ref)) =>
log.info(ref.path)
self ! ref.path
}
По the documentation вы можете использовать ActorSelection
с групповым символом *
, чтобы актеры отправить идентификации сообщений. У вас может быть актер, который собирает ActorRef
с.
Как упоминалось в @ chris-martin, только те, кто в данный момент не занят, отправят. Очень простой актер:
// make all the available actor to send an identifying message
public void freeActors()
{
ActorSelection selection =
getContext().actorSelection("/user/*");
selection.tell(new Identify(identifyId), getSelf());
}
...
// collect responses
@Override
public void onReceive(Object message) {
if (message instanceof ActorIdentity) {
ActorIdentity identity = (ActorIdentity) message;
// get the ref of the sender
ActorRef ref = identity.getRef();
// the sender is up and available
...
EDIT: Я знаю, что это для Java, но мне это показалось полезным.
ActorSystem
имеет приватный метод printTree
, который вы можете использовать для отладки.
1) Закрытый метод вызывающего абонента (из https://gist.github.com/jorgeortiz85/908035):
class PrivateMethodCaller(x: AnyRef, methodName: String) {
def apply(_args: Any*): Any = {
val args = _args.map(_.asInstanceOf[AnyRef])
def _parents: Stream[Class[_]] = Stream(x.getClass) #::: _parents.map(_.getSuperclass)
val parents = _parents.takeWhile(_ != null).toList
val methods = parents.flatMap(_.getDeclaredMethods)
val method = methods.find(_.getName == methodName).getOrElse(throw new IllegalArgumentException("Method " + methodName + " not found"))
method.setAccessible(true)
method.invoke(x, args: _*)
}
}
class PrivateMethodExposer(x: AnyRef) {
def apply(method: scala.Symbol): PrivateMethodCaller = new PrivateMethodCaller(x, method.name)
}
2) Использование
val res = new PrivateMethodExposer(system)('printTree)()
println(res)
Напечатает:
->/LocalActorRefProvider$$anon$1 class akka.actor.LocalActorRefProvider$Guardian status=0 2 children
⌊-> system LocalActorRef class akka.actor.LocalActorRefProvider$SystemGuardian status=0 3 children
| ⌊-> deadLetterListener RepointableActorRef class akka.event.DeadLetterListener status=0 no children
| ⌊-> eventStreamUnsubscriber-1 RepointableActorRef class akka.event.EventStreamUnsubscriber status=0 no children
| ⌊-> log1-Logging$DefaultLogger RepointableActorRef class akka.event.Logging$DefaultLogger status=0 no children
⌊-> user LocalActorRef class akka.actor.LocalActorRefProvider$Guardian status=0 1 children
...
Осторожно, это может привести к OOM Если у вас есть много актеров.
- 1. Акка Система актеров ResolveOne() работает?
- 2. Акка удаленных актеров из разных сетей
- 3. Акка Остановить/убить актеров после завершения обработки
- 4. Как считать актеров определенного типа активными в определенное время в системе акка?
- 5. Акка поддерживает актеров более высокого порядка?
- 6. остановить всех актеров в системе, не выключая саму систему?
- 7. Как работает() работает в актерской системе Акка?
- 8. Как присоединить несколько актеров в качестве источников потока Акка?
- 9. Акка Акка - разделяющая ответственность
- 10. Как реализовать простой протокол с помощью Актеров и Акка?
- 11. Обещание Акка/Скала, которое требует двух актеров для завершения
- 12. Есть ли образец для создания Акка-Актеров, если их нет?
- 13. Акка актеров/Scala - одного OnSuccess для нескольких спрашивает
- 14. Акка persistence receiveRecover получает моментальные снимки из других экземпляров актеров
- 15. Тестирование Акка-актеров, которые смешивают Stash с TestActorRef
- 16. Тестирование аккских актеров с участием Котлина и Акка-Тесткита
- 17. Акка удаленных актеров не может общаться между Play! приложения
- 18. Как создать «Аккаунт Акка» в игровой системе 2.5.x?
- 19. Как создать минимального аккера Акка?
- 20. Глобальная переменная в системе аккордов акка в Scala
- 21. Как мы тестируем актеров в Java?
- 22. Использование ScalaTest для тестирования акк-актеров
- 23. Как печатать данные всех значений?
- 24. Cluster Акка/Scala players
- 25. Запуск перезагрузки Акка Акка
- 26. Акка и синглтонные актеры
- 27. Понимание резьбы аккеров Акка
- 28. Акка Акка не инициализируется
- 29. Проверка акка Акка
- 30. Выключение системы Акка с актера