2016-03-24 14 views
3

Bağlantı kesikli durumda birkaç saniyeliğine açık tutulabilir mi? istekteElixir Fiş bağlantısını açık kefalet modunda tutun

Ben aldığı birkaç süreçleri oluşturmak 5 saniye bitirmek ve bundan sonra ben istemciye yığın aracılığıyla yanıt göndermek istediğiniz diyelim, ancak bağlantı

Ben postacı ile bu test ediyorum kapalıdır ve bu başlıklara sahip :

"Bağlantı": "Canlı tutma", "Keep-Alive": "zaman aşımı 10000 ="

Bu çıkış her zaman benim en aza uygulamadır edilir "InitEnd" istenen sonuçtur : "Init1234 Böyle 567789End" falan:

defmodule AlivePlug do 
    import Plug.Conn 

    def init(opts) do 
    opts 
    end 

    def call(conn, _opts) do 
    conn = send_chunked(conn, 200) 
    # send initial chunk 
    chunk(conn, "Init") 

    pid = start_thread 
    # create 10 async processes which does somthing for 5 seconds and then sends result via chunk 
    1..10 
    |> Enum.each(fn num -> 
     send pid, {conn, num} 
    end) 

    # send End as a symbol of last chunk 
    chunk(conn, "End") 
    conn 
    end 

    defp start_thread, do: spawn_link(fn -> thread_listener end) 
    defp thread_listener do 
    receive do 
     {conn, num} -> 
     :timer.sleep(5000) 
     # problem is here :(
     # chunk returns {:error, :closed} 
     {:error, :closed} = chunk(conn, "#{num}") 
     thread_listener 
     _ -> 
     thread_listener 
    end 
    end 
end 
+0

Yanıtınızı göndermek için başka bir bağlantı açmak mümkün mü acaba? – vikram7

cevap

0

çözüm olarak, ben periyodik conn kullanıyorum. Ek bilgi olarak

receive do 
    ... 
    after 3000 -> 
    # avoid connection close. 
    # execute `chunk(conn, ".")` every 3000ms 
    chunk(conn, ".") 
end 

, chunk 'ın 2 argümanı boş değil dizisi olmalıdır.