greenz1
Help with Elixir app management
I am building an Elixir app for prod. It has a :observer.start layout as given below
My app’s flow is as follows.
Step 1: Workers under Elixir.AppName.MQTT.Supervisor receive some message.
Step 2: This message is sent to Elixir.AppName.Server
Step 3: Elixir.AppName.Server starts a worker dynamically under Elixir.AppName.on.Supervisor.
Step 4: The worker receives the message and acts accordingly
Let us call the worker, which is a GenServer, WORKER
My problem is that every time I have to perform some task in WORKERs I end up using send self(), message and having a corresponding handle_info in the WORKER.
I feel there is some issue with my current approach as I cannot utilize functions like GenServer.call or GenServer.cast
How should I remodel the application so that it makes use of other GenServer functions and callbacks?
Most Liked
kokolegorille
Maybe You can do like this?
# Maybe there is a typo in your module name :slight_smile:
defmodule AppName.on.Worker do
use GenServer
# THIS IS API
def start_link do
# receives the message as argument
GenServer.start_link/3
end
def some_task, do: GenServer.call ...
# THIS IS SERVER SIDE
def init/1 do
send self(), {:check_args, message_from_mqtt_as_map}
{:ok, state}
end
# Wherever You need it...
def handle_call(:some_task, _from, _state) do
perform_some_task()
end
def handle_info({:check_args, message_from_mqtt_as_map}, state) do
case message_from_mqtt_as_map["action"] do
:create ->
do_create(message_from_mqtt_as_map)
perform_some_task()
...
end
{:noreply, state}
end
# helper functions for the task
defp perform_some_task, do: ...
end
BTW Why do You need to do this
send self(), :some_task
instead of a simple function call?








