在我的频道中寻求测试terminate/2 callback的帮助。
测试和设置如下:
setup do :ok = Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo) Ecto.Adapters.SQL.Sandbox.mode(MyApp.Repo, {:shared, self()}) {:ok, socket} = connect(UserSocket, %{token: "some_token"}) {:ok, %{}, socket} = subscribe_and_join(socket, "some_channel", %{}) %{socket: socket} end test "terminate/2", %{socket: socket} do # for avoiding "** (EXIT from #PID<...>) {:shutdown, :closed}" Process.unlink(socket.channel_pid) assert close(socket) == :ok # some additional asserts go here end
在terminate / 2方法中,我仅调用一个帮助程序模块,我们将其命名为
TerminationHandler
。
def terminate(_reason, _socket) do TerminationHandler.call() end
并且TerminationHandler中的call / 0方法包含一个数据库查询。它看起来像这样,即
def call() do users = User |> where([u], u.type == "super") |> Repo.all # line where error appears # some extra logic goes here end
这是我定期收到的错误(也许每10次运行一次)
14:31:29.312 [error] GenServer #PID<0.1041.0> terminating ** (stop) exited in: GenServer.call(#PID<0.1040.0>, {:checkout, #Reference<0.3713952378.42205187.247763>, true, 60000}, 5000) ** (EXIT) shutdown: "owner #PID<0.1039.0> exited with: shutdown" (db_connection) lib/db_connection/ownership/proxy.ex:32: DBConnection.Ownership.Proxy.checkout/2 (db_connection) lib/db_connection.ex:928: DBConnection.checkout/2 (db_connection) lib/db_connection.ex:750: DBConnection.run/3 (db_connection) lib/db_connection.ex:644: DBConnection.execute/4 (ecto) lib/ecto/adapters/postgres/connection.ex:98: Ecto.Adapters.Postgres.Connection.execute/4 (ecto) lib/ecto/adapters/sql.ex:256: Ecto.Adapters.SQL.sql_call/6 (ecto) lib/ecto/adapters/sql.ex:436: Ecto.Adapters.SQL.execute_or_reset/7 (ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5 (ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4 (my_app) lib/my_app/helpers/termination_handler.ex:4: MyApp.Helpers.TerminationHandler.call/0 (stdlib) gen_server.erl:673: :gen_server.try_terminate/3 (stdlib) gen_server.erl:858: :gen_server.terminate/10 (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3 Last message: {:join, Phoenix.Channel.Server}Last message: {:join, Phoenix.Channel.Server}
将感谢您提供有关此错误的原因以及避免该错误的可能方法的任何回复。
正在我的频道中寻求测试终止/ 2回调的帮助。测试和设置如下所示:setup do:ok = Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo)Ecto.Adapters.SQL.Sandbox.mode(...
GenServer.terminate/2
,并且:shutdown
将具有超时终止的持续时间。 如果在此超时持续时间内该进程仍然存在,它将立即被杀死。