느릅 나무, 피닉스, 그리고 엘릭서는 꽤 새로운 것입니다 그래서 나는 channels test app 간단한 예제 응용 프로그램을 피닉스 채널의 사용을 테스트하게 만들 줄 알았는데. 응용 프로그램은 너무 오래된 부품에서 만든 때문에 다른 물건을 가지고 있지만 "나"이 부분을 맨손으로.느릅 나무 신청 피닉스 채널 방송 수신을 중지합니다
아이디어는 phoenix 끝점으로 http 호출을하는 몇 개의 genservers가 있다는 것입니다. 기본적으로 그들은 단지 에이전트 프로세스에서 개최되는 목록을 업데이트하고 있습니다. 그 목록은 phoenix 채널을 통해 Elm 앱에 표시됩니다. 목표는 에이전트 상태가 여러 프로세스로 자주 업데이트되는 경우 어떤 일이 발생하는지 확인하는 것입니다.
그래서 지금까지 내가 가지고있는 것입니다. 필자는 Elm app 설정을 사용하는 phoenix 사이트와 genservers가 업데이트하는 별도의 Elixir 앱을 가지고 있습니다. 모든 것이 20 초 정도 잘 작동하지만 브라우저에서 새로 고침을하지 않으면 채널 연결이 끊어지고 다시 연결되지 않습니다. 로깅에서 백엔드가 여전히 정상적으로 작동하고 있으며 브라우저 콘솔에도 오류가 없음을 알 수 있습니다. 그럼 여기서 거래가 뭐야? 내가 잃어버린 경우 채널 연결을 자동으로 다시 연결해야한다고 생각하고 어쨌든 연결이 끊어지는 이유는 무엇입니까?
나는 elm-phoenix-socket에 문제가 있다고 추측합니다.
다음socketServer : String
socketServer =
"ws://localhost:4000/socket/websocket"
initPhxSocket : Phoenix.Socket.Socket Msg
initPhxSocket =
Phoenix.Socket.init socketServer
|> Phoenix.Socket.withDebug
|> Phoenix.Socket.on "new:heartbeats" "heartbeats:lobby" ReceiveHeartbeats
이 방송은 백엔드에서 수행되는 방법은 다음과 같습니다 : 하트 비트 엔드 포인트에
defmodule AbottiWeb.ApiController do
use AbottiWeb.Web, :controller
def index(conn, _params) do
beats = AbottiWeb.HeartbeatAgent.get()
json conn, beats
end
def heartbeat(conn, %{"agent" => agent}) do
AbottiWeb.HeartbeatAgent.update(agent)
beats = AbottiWeb.HeartbeatAgent.get()
AbottiWeb.Endpoint.broadcast("heartbeats:lobby", "new:heartbeats", beats)
json conn, :ok
end
end
그래서 본질적으로 genservers 지속적으로하고 있습니다 전화 여기가 느릅 응용 프로그램의 설정입니다. 나는 문제가 여기에 있는지 의심 스럽다. 문제가있다 또 다른 가능성은 다음과 같습니다 채널 설정 :
user_socket.ex :
defmodule AbottiWeb.UserSocket do
use Phoenix.Socket
channel "heartbeats:*", AbottiWeb.HeartbeatChannel
transport :websocket, Phoenix.Transports.WebSocket
def connect(_params, socket) do
{:ok, socket}
end
def id(_socket), do: nil
end
및 heartbeat_channel.ex :
defmodule AbottiWeb.HeartbeatChannel do
use AbottiWeb.Web, :channel
require Logger
def join("heartbeats:lobby", payload, socket) do
Logger.debug "Hearbeats:lobby joined: #{inspect payload}"
if authorized?(payload) do
{:ok, socket}
else
{:error, %{reason: "unauthorized"}}
end
end
# Channels can be used in a request/response fashion
# by sending replies to requests from the client
def handle_in("ping", payload, socket) do
{:reply, {:ok, payload}, socket}
end
# It is also common to receive messages from the client and
# broadcast to everyone in the current topic (heartbeats:lobby).
def handle_in("shout", payload, socket) do
broadcast socket, "shout", payload
{:noreply, socket}
end
# This is invoked every time a notification is being broadcast
# to the client. The default implementation is just to push it
# downstream but one could filter or change the event.
def handle_out(event, payload, socket) do
Logger.debug "Broadcasting #{inspect event} #{inspect payload}"
push socket, event, payload
{:noreply, socket}
end
# Add authorization logic here as required.
defp authorized?(_payload) do
true
end
end
문제가 무엇인지 그래서 어떤 아이디어
? 그것은 추측하고있는 Im는 정말로 단순한 무엇인가이다.이제 소켓 전송 시간이 초과되었음을 알았습니다. 그런데 왜 그렇게합니까?
어떻게 든이 설정은 무시되고 60 초 후에 socked 연결이 닫힙니다. – mxgrn