FelisOrion

FelisOrion

How to run more then one same worker (Cachex) inside Supervision

Hi, I’m trying to add inside my application supervision tree two of Cachex (Cachex — Cachex v4.1.1) worker but getting error:

** bad child specification, more than one child specification has the id: Cachex. **

code :
children = [

worker(Cachex, [:requests, ]),
worker(Cachex, [:ntf, ])
]

As error text suggesting using to use maps as child specifications, i changed code to look like this:

children = [
Supervisor.child_spec({Cachex, [:requests, ]}, id: :my_cache_1),
Supervisor.child_spec({Cachex, [:ntf, ]}, id: :my_cache_2)
]

but now getting ** (EXIT) :invalid_name **
I wonder if there is any way to make it work or if some one more familiar with this library and can help me.

Thanks!

Marked As Solved

dom

dom

This:

{Cachex, [:requests, []]}

means the supervisor will call Cachex.start_link/1 like this:

Cachex.start_link([:requests, []])

rather than Cachex.start_link/2, which is probably what you expected:

Cachex.start_link(:requests, [])

So passing {Cachex, :requests} instead should work, because it’ll call Cachex.start_link(:requests).

If you want to pass options later on you’ll have to set the start function in the child spec yourself to make sure it calls start_link/2 and not start_link/1.

For context, recent Elixir guidelines are to always use start_link/1, so it’s normally not a problem. Cachex probably predates that.

Also Liked

FelisOrion

FelisOrion

Just in case some one need to see code for implementation:

def start(_type, _args) do
  import Supervisor.Spec
  import Cachex.Spec

  children = [
      %{id: Cache1, start: {Cachex, :start_link, [:requests, []]}},
      %{id: Cache2, start: {Cachex, :start_link, [:messages, []]}}
    ]
  opts = [strategy: :one_for_one]
  Supervisor.start_link(children, opts)
end
McTheels

McTheels

Going to leave this here in case the above responses do not work for later versions of the dependencies as well as elixir.

You can also set the following in your application.ex

children = [
      # Start the Telemetry supervisor
      # Start the Ecto repository
      Supervisor.child_spec({Cachex, :my_cache}, id: :my_cache),
      Supervisor.child_spec({Cachex, :temp_cache}, id: :temp_cache),
      ...
     ]
kamaroly

kamaroly

This worked for me! Thank you.

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: <h1>Create Post</h1> <%= ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New

Other popular topics Top

New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement