Настройка нескольких репозиториев в приложении Elixir

Я пытаюсь настроить два репозитория в своем приложении Elixir, используя Ecto.
Мне нужна помощь, чтобы настроить их так, чтобы они оба контролировались независимо друг от друга с помощью стратегии «один за одного»; Я предполагаю, что это правильно и будет означать, что процессы, использующие их, будут перезапущены.

Репо-А и Репо-Б

Настройка mix.exs:

def application do
  [applications: [:logger, :tds, :tds_ecto, :ecto, :httpoison, :csvlixir],
   mod: {MyApp, []}]
end

MyApp_app.ex

Фрагмент ниже:

def start(_type, _args) do
    import Supervisor.Spec, warn: false

   children = [
   supervisor(MyApp.Repo-A, []), 
   worker(Task, [MyAppModule, :work, []], restart: :temporary),
   supervisor(MyApp.Repo-B, []), 
   worker(Task, [MyAppModule, :work, []], restart: :temporary)
 ]

 # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
 # for other strategies and supported options
 opts = [strategy: :one_for_one, name: MyApp.Supervisor]
 Supervisor.start_link(children, opts)
end

defmodule Repo-A do
  use Ecto.Repo, otp_app: :myapp
end

defmodule Repo-B do
  use Ecto.Repo, otp_app: :myapp
end

Когда я mix run получаю следующее: я не знаю, как правильно определить id.

** (Mix) Could not start application myapp: exited in: MyApp.start(:normal, [])
 ** (EXIT) an exception was raised:
     ** (ArgumentError) duplicated id Task found in the supervisor  specification, please explicitly pass the :id option when defining this worker/supervisor

person Steve O    schedule 15.03.2016    source источник
comment
Я не думаю, что проблема связана с Экто, разве это не результат двойного вызова worker(Task, [MyAppModule, :work, []], restart: :temporary),?   -  person Gazler    schedule 15.03.2016
comment
@Gazler - да, согласен, это не проблема с Ecto - просто мое использование его нубом :) Я не уверен, как настроить супервизора и работника для двух репозиториев - я уверен, что мой опубликованный код неверен ...   -  person Steve O    schedule 15.03.2016


Ответы (1)


Вы добавляете аргумент id в список ключевых слов opts, например:

worker(Task, [MyAppModule, :work, []], restart: :temporary, id: :my_app_module_1)
person Jason Harrelson    schedule 15.03.2016
comment
Джейсон - спасибо за вклад, хотя я не отмечаю это как правильный ответ, потому что, хотя он позволяет нам определить идентификатор, он не позволяет регистрировать два модуля Recto независимо; второе репо недоступно для использования. Извините, если вопрос неясен, но вопрос начинается с проблемы с настройкой двух репозиториев. - person Steve O; 16.03.2016
comment
Тогда я, видимо, не полностью понимаю всю вашу проблему. Извини. Предоставленный вами вывод ошибки, по-видимому, указывает на то, что проблема id. - person Jason Harrelson; 18.03.2016