Приложение не перезапускается после нормального выхода - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь подключиться к mqtt с помощью tortoise. Когда мое соединение прерывается, оно подключается без проблем, но когда мое приложение завершается, оно не перезапускается в соответствии со стратегией :one_to_one. Я запустил приложение в mod mix.exs. Должен ли я положить его в супервизор и запустить супервизор? Требуется start без аргументов, как правильно достичь этого. Что делать, если мое приложение вылетает? И мой connection.ex должен быть genserver? Пожалуйста, предложите.

mix.exs

defmodule SslMqtt.MixProject do
  use Mix.Project

  def project do
    [
      app: :ssl_mqtt,
      version: "0.1.0",
      elixir: "~> 1.6",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
     mod: {SslMqtt.Application,[]}, 
     extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
    {:tortoise, "~> 0.9"}
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
    ]
  end
end

application.ex

defmodule SslMqtt.Application do
  use Application

  def start(_type, _args) do

    IO.puts "inside supervisor application start"
    SslMqtt.Supervisor.start_link(name: SslMqtt.Supervisor)
  end
end

supervisor.ex

defmodule SslMqtt.Supervisor do
  use Supervisor

  def start_link(opts) do
    IO.puts "inside supervisor start link"
    Supervisor.start_link(__MODULE__, :ok, opts)
  end

  def init(:ok) do

    IO.puts "inside supervisor init"
    children = [

  %{
        id: SslMqtt.MqttConnection,
        start: { SslMqtt.MqttConnection, :start_link, [1,2]},
        type: :worker,
        restart: :permanent,
        shutdown: 500
      }

    ]

    Supervisor.init(children, strategy: :one_for_one)
  end
end

connection.ex

defmodule SslMqtt.MqttConnection do

def start_link(_type,_arg) do

{:ok,pid}=Tortoise.Connection.start_link(
    client_id: William,
    server: {Tortoise.Transport.Tcp, host: 'iot.eclipse.org', port: 1883},
    handler: {Tortoise.Handler.Logger, []},
    will: %Tortoise.Package.Publish{topic: "foo/bar", payload: "goodbye"}
  )
end



end

1 Ответ

3 голосов
/ 19 марта 2019

Проблема с вашим Application.Это должно быть

def start(_type, _args) do
  children = [
    {SslMqtt.Supervisor, []}
  ]

  opts = [strategy: :one_for_one, name: SslMqtt.Supervisor]
  Supervisor.start_link(children, opts)
end

Таким образом, приложение будет контролировать SslMqtt.Supervisor.То, что вы делаете сейчас, вы просто начинаете SslMqtt.Supervisor, без присмотра.

...