twitter - How to create GenServer child process from spawn function? -
i'm using extwitter stream track tweets in realtime , broadcast them via channel endpoint. create 1 process per event , assign 1 twitter stream listener, when new subscriber join same event previous stream state , receive , broadcast new tweets.
how create genserver process from:
stream = extwitter.stream_filter(track: hashtags) pid = spawn(fn -> tweet <- stream io.puts tweet.text myapp.endpoint.broadcast! "stream", "tweet", %{tweet: tweet.text} end end)
and assign event_id child in following module:
defmodule myapp.twitterstream.monitor require iex @moduledoc """ store twitter stream per event_id """ use genserver def create(event_id, hashtags, coords) case genserver.whereis(ref(event_id)) nil -> supervisor.start_child(myapp.twitterstream.supervisor, [event_id, hashtags, coords]) _twitter_stream -> iex.pry # return previous extwitter stream state , broadcast new tweets {:error, :twitter_stream_already_exists} end end def start_link(event_id, hashtags, coords) # stream = extwitter.stream_filter(track: hashtags) # pid = spawn(fn -> # tweet <- stream # io.puts tweet.text # myapp.endpoint.broadcast! "stream", "tweet", %{tweet: tweet.text} # end # end) genserver.start_link(__module__, %{hashtags: hashtags, coords: coords}, name: ref(event_id)) end def stop(event_id) try_call(event_id, :stop) end def info(event_id) try_call(event_id, :info) end def handle_call(:stop, _from, state) # extwitter.stream_control(pid, :stop) {:stop, :normal, :ok, state} end def handle_call(:info, _from, state) {:reply, state, state} end defp try_call(event_id, call_function) case genserver.whereis(ref(event_id)) nil -> {:error, :invalid_twitter_stream} twitter_stream -> genserver.call(twitter_stream, call_function) end end defp ref(event_id) {:global, {:twitter_stream, event_id}} end end
how receive new tweets or stop twitter stream outside event monitor?
supervisor:
defmodule myapp.twitterstream.supervisor use supervisor def start_link supervisor.start_link(__module__, :ok, name: __module__) end def init(:ok) children = [ worker(myapp.twitterstream.monitor, [], restart: :temporary) ] supervise(children, strategy: :simple_one_for_one) end end
Comments
Post a Comment