10
votes

Comment trouver les travailleurs de mon application Elixir?

Travailler à travers le superviseur et application fait partie de la mise en route Tutoriel, j'écris un test de l'unité pour le problème de l'arborescence de supervision en bas. J'ai essayé de démarrer le superviseur de haut niveau, mais il a échoué avec cette erreur:

1) test all buckets die if registry dies (KV.SupervisorTest)
   test/kv/supervisor_test.exs:4
   ** (ArgumentError) argument error
   stacktrace:
     :erlang.send(KV.Registry, {:"$gen_cast", {:create, "shopping"}})
     (elixir) lib/gen_server.ex:424: GenServer.do_send/2
     test/kv/supervisor_test.exs:6


1 commentaires

Pour obtenir la branche de cette question, vous devez ajouter cette étape: $ git checkout -b s_o_question origine / s_o_find_worker_question


3 Réponses :


1
votes

Après avoir cloné votre repo, j'ai regardé autour de moi. Je n'ai pas pu démarrer l'application. Normalement, les applications Elixir peuvent être démarrées à partir de la ligne de commande en exécutant:

Supervisor.which_children(KV.Supervisor) # Pass in the name of your supervisor module


2 commentaires

KV.Supervisor est défini à partir de la ligne 42 ici: Github.com / ijt / kv / blob / s_o_find_worker_question / lib / kv / ... . Je ne suis pas sûr de comprendre.


Il y a une autre étape lorsque vous clonez le repo. Vous devez également consulter la succursale: Git Checkout -B s_o_question Origine / S_O_Find_worker_Question.



10
votes

Vous ne pouvez pas trouver kv.registry car il y a une faute de frappe dans votre code. Vous appelez: xxx pré>

mais la définition est la suivante: p> xxx pré>

de sorte que vous passez [nom: kv.registry] comme gauxts_supervisor, opte est [ ] et votre travailleur n'est donc pas inscrit sous le nom kv.registry. P>

Essayez ce correctif: https: //github.com/mprymek/kv/commit/03ce2e4e5ab4287db2fab6de0bb1aaf0226346f P>

 iex(1)> :erlang.whereis KV.Registry
 #PID<0.111.0>


2 commentaires

P.s. Si votre code correct du fonctionnement dépend de certains arguments, il devrait probablement être obligatoire. Si vous avez défini votre fonctionnement comme «DEF Start_Link (Event_Manager, Buckets_supervisor, OPTS)», cela ne se produirait pas.


Changer la ligne de travailleurs L'a fait: Travailleur (KV.Rregistry, [@Manager_Name, @bucket_sup_name, [Nom: @registry_name]])



6
votes

Si vous démarrez le superviseur lui donnant un nom, vous pouvez obtenir tous les travailleurs:

Supervisor.which_children(MyApp.Supervisor)


2 commentaires

Voici ce qui se passe: iex (1)> superviseur.which_children (kv.supervisor (kv.supervisor) ** (sortie) Extrait dans: Genserver.Call (KV.Supervisor (KV.Supervisor ,: QUI_CHILDRENS,: INFINITY) ** (sortie) Pas de processus ( ELIXIR) LIB / GEN_SERVER.EX: 356: GENSERVER.CALL/3 Même si je peux voir que le kv.supervisor a commencé à partir d'un message de journal. Je n'ai qu'un appel à travailleur (Genevent, ...) .


Ah, je vois. Je devais changer le corps kv.supervisor.start_link à supervisor.start_link (__ module__,: ok, [Nom: kv.supervisor]) . Maintenant que votre extrait fonctionne.