2016-09-24 3 views
0

느릅 나무, 피닉스, 그리고 엘릭서는 꽤 새로운 것입니다 그래서 나는 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는 정말로 단순한 무엇인가이다.

이제 소켓 전송 시간이 초과되었음을 알았습니다. 그런데 왜 그렇게합니까?

답변

2

글쎄, 나는이 그것을 해결 :

transport :websocket, Phoenix.Transports.WebSocket, 
    timeout: :infinity 

가 얼마나 해로운 몰라하지만 그것이 정말 중요하지 않습니다 테스트 응용되고.

+0

어떻게 든이 설정은 무시되고 60 초 후에 socked 연결이 닫힙니다. – mxgrn

관련 문제