为什么 Supervisor.start_child 不起作用

2024-03-27

我是 Elixir 的初学者。

我有一个应用程序在 application.ex 中启动一个自定义主管。代码:

defmodule MyApp do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      supervisor(MyApp.Web.Endpoint, []),
      supervisor(MyApp.Repo, []),

      #my notifier
      MyApp.MyNotifier.Supervisor
    ]
    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

Supervisor 的代码是这样的:

defmodule MyApp.MyNotifier.Supervisor do

  use Supervisor

  def start_link(_options), do:
    Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)

  def start_my_notifier(state) do
    Supervisor.start_child(__MODULE__, state)
  end

  def init(:ok) do
    Supervisor.init([], strategy: :one_for_one)
  end

end

而worker的代码是这样的:

defmodule MyApp.MyNotifier do
  use GenServer

  # Client

  def start_link(state) do
    GenServer.start_link(__MODULE__, state)
  end

  # Server

  def init(state) do
    # Reschedule
    reschedule(state)
    # Reply
    {:ok, state}
  end

  def handle_info(:reschedule, state) do

    case state["count"] < 9 do
      true ->
        # Send notification
        MyNotifier.Helper.notify_past_delivery_time(sate["id"])
        # Reschedule once more
        reschedule(state)
      false ->
        # End process
        Process.exit(self(), :normal)
    end

    {:noreply, state}
  end

  defp reschedule(state) do
    Process.send_after(self(), :reschedule, state["time"] * 60 * 1000)
  end
end

当我的应用程序中发生某些情况时,我想使用以下代码动态添加/启动一个工作人员:

MyNotifier.Supervisor.start_my_notifier(%{"name" => name, "id" => id, "time" => 15, "count" => 0})

当我在调试模式下运行应用程序时(iex -S mix phx.server)并将一个 IEx.pry 放入工作线程的 init 函数中(然后我们强制应用程序进入启动子进程的状态)。为什么应用程序永远不会停止?


调用的第二个参数Supervisor.start_child/2 https://hexdocs.pm/elixir/Supervisor.html#start_child/2应该是一个子规范,所以而不是:

Supervisor.start_child(__MODULE__, state)

它应该有点像:

Supervisor.start_child(__MODULE__, [self(), MyApp.MyNotifier, [state]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Supervisor.start_child 不起作用 的相关文章

  • 了解 Elixir 函数参数中的模式匹配

    在 Elixir in Action 一书中 其中一个示例的一个函数颠覆了我对模式匹配的理解 def add entry TodoList entries entries auto id auto id todo list entry do
  • 输出端口“tcp_inet”上的值错误

    我正在使用 Phoenix 框架 它在下面运行 Cowboy 我偶尔会在日志中看到以下一对错误 Bad value on output port tcp inet GenServer PID lt 0 8423 1 gt terminati
  • Erlang/OTP 架构:SOAish 服务的 RESTful 协议

    让我们想象一下 我们有一个为披萨店设计和构建的订单处理系统 要求是 R1 系统应该与客户端和用例无关 这意味着系统可以由初始设计期间未考虑到的客户端访问 例如 如果披萨店决定其许多顾客稍后使用三星 Bada 智能手机 那么为 Bada OS
  • 在 Elixir 中测试异步代码

    我想测试一个正在使用的函数Task async 为了让我的测试通过 我需要让它在断言之前休眠 100 毫秒 否则测试进程会在执行异步任务之前被终止 有没有更好的办法 编辑 添加代码示例 我想测试的代码 大致 def search param
  • Ecto 与某种情况的关联

    假设我有两个模型 Post and Comment评论模型可以是两种类型中的一种 normal and fancy由列定义type in the comments table 现在我想在我的上添加 2 个关联Post模型 其中一个指的是花哨
  • 在 Elixir 中将映射转换为关键字列表

    我有一张以下形式的地图 browser name gt Chrome platform gt linux 我需要将其转换为关键字列表 browser name Chrome platform linux 实现这一目标的最佳方法是什么 这行不
  • Elixir/erlang 在哪里适合微服务方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近 我一直在使用 docker compose 进行一些实验 以便部署多个协作微服务 我可以看到微服务提供的许多好处 而且现在有一个
  • UndefinedFunctionError phoenix Elixir 新项目

    全新安装 Phoenix 后 我尝试触发一个新项目 当我尝试运行服务器时 我遇到了 Unchecked dependencies for environment dev gettext Hex package the dependency
  • 从映射中添加/删除键值对

    如何在 Elixir 映射中添加 和删除 键值对 这不起作用 map a 1 b 2 c 3 map d 4 添加到地图 Use Map put map key value https hexdocs pm elixir Map html
  • 如何在启动 iex 会话时执行一些命令?

    假设我想在项目的根路径中启动 iex 时实现一些命令 例如 Logger configure level info require Ecto Query alias MyApp User and so on 我想在每次启动 iex 时自动执
  • 为什么我收到#Ecto.Association.NotLoaded?

    我有团队 每个团队都有用户 因此有一个连接表将用户链接到团队 因为它是多对多关系 这是我的模型 defmodule App Team do use App Web model schema teams do field owner id i
  • 有没有一种简单的方法可以查看 Elixir 宏扩展为什么?

    在过去 18 个月左右的时间里 Elixir 一直是我的首选语言 但有时我发现 无魔法 口头禅 特别是在 Phoenix 与 Rails 中引用 和宏的使用之间存在紧张关系 虽然我现在在使用没有宏的语言时会怀念宏 但我仍然希望能更容易地看到
  • 使用 HTTPoison 初始化模块属性

    我正在尝试像这样初始化模块属性 response HTTPoison get url ok response Poison decode response body attr response 我以前用一个文件做过这样的事情 externa
  • 如何将 Elixir 库加载到 iex 中而不将其添加到项目的 mix.exs deps 中?

    我想尝试 Poison json 模块而不创建混合项目 如何安装它并通过导入使其在 iex 中可用 我已经能够将它添加到项目中 然后在进入项目目录并使用 iex S mix 后使用它 tbrowne LILJEN code elixirTr
  • Elixir - 递归列表值的总和

    只是尝试对列表值进行简单求和 defmodule Mth do def sum list do 0 end def sum list H T do H sum list T end end IO puts Mth sum list 1 2
  • 为什么在 Erlang 中使用 OTP?

    正如问题所说 使用 Erlang 进行开发时 使用 OTP 设计原则会带来什么好处 我正在开发一个仅接收命令并发送响应的服务器 正如 Jonas 所说 OTP 是一组久经考验的设计元素和习惯用法 用于创建容错系统以及其他功能 例如灵活性 实
  • Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

    我有一个行为 X 和一个参数类型的回调函数 a any 模块 Y 实现行为 X 实现模块 Y 中的回调函数具有参数类型 a any b any Dialyzer 不喜欢这样并抱怨 a b gt is not a supertype of a
  • 如何在 Elixir 或 Phoenix 框架中安排代码每隔几个小时运行一次?

    假设我想每 4 小时发送一堆电子邮件或重新创建站点地图或其他任何内容 我该如何在 Phoenix 或仅使用 Elixir 做到这一点 有一个简单的替代方案 不需要任何外部依赖项 defmodule MyApp Periodically do
  • 如何完全禁用 Elixir/Phoenix 生成器和模型中的上下文?

    凤凰城有一个发电机 mix phx gen html Accounts User users name string age integer 我不想为我的模型使用上下文 也不想提供它的名称 如何禁用它 您仍然可以使用 1 2 及更早版本中的
  • Ecto 中按日期时间查询

    这是我尝试过的 date Ecto DateTime from erl calendar universal time query gt where record record deadline gt date 我也尝试过 date Ect

随机推荐