【发布时间】:2016-07-24 10:32:39
【问题描述】:
我有一个GenServer,它通过gen_tcp 连接到远程TCP 连接。
opts = [:binary, active: true, packet: :line]
{:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}
我正在处理消息:
def handle_info({:tcp, socket, msg}, stage) do
IO.inspect msg
{:noreply, state}
end
效果很好。但是,TCP 服务器很容易超时。如果我使用gen_tcp.recv,我可以指定超时。但是,我使用active: true 来接收带有handle_info 的消息,而不必循环调用recv。所以,GenServer 很高兴地等待下一条消息,即使服务器已经超时。
如何让GenServer 在 X 秒后没有收到来自 TCP 连接的消息时触发函数?我被recv 卡住了吗?
【问题讨论】:
-
不知道为什么有人反对这个。这是许多人在早期使用
{active, true}套接字使用 Erlang、Elixir、LFE 等时遇到的一个基本难题——解决方案不仅适用于 Elixir。