mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-01-11 09:27:47 +08:00
67 lines
1.2 KiB
Elixir
67 lines
1.2 KiB
Elixir
defmodule Demo.Application do
|
|
@moduledoc false
|
|
|
|
use Application
|
|
|
|
@impl true
|
|
def start(_type, _args) do
|
|
children = [
|
|
Demo.Server
|
|
]
|
|
|
|
opts = [strategy: :one_for_one, name: Demo.Supervisor]
|
|
Supervisor.start_link(children, opts)
|
|
end
|
|
end
|
|
|
|
defmodule Demo.Server do
|
|
use GenServer
|
|
|
|
def start_link(arg) do
|
|
GenServer.start_link(__MODULE__, arg, name: __MODULE__)
|
|
end
|
|
|
|
@impl true
|
|
def init(_) do
|
|
Process.flag(:trap_exit, true)
|
|
|
|
{:ok, pid} = ElixirKit.start()
|
|
ref = Process.monitor(pid)
|
|
|
|
ElixirKit.publish("log", "Hello from Elixir!")
|
|
|
|
Task.start(fn ->
|
|
for i <- 5..1//-1 do
|
|
message = "Stopping in #{i}..."
|
|
log(message)
|
|
ElixirKit.publish("log", message)
|
|
Process.sleep(1000)
|
|
end
|
|
|
|
System.stop()
|
|
end)
|
|
|
|
{:ok, %{ref: ref}}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({:event, "log", message}, state) do
|
|
log(message)
|
|
{:noreply, state}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({:DOWN, ref, :process, _, :shutdown}, state) when ref == state.ref do
|
|
System.stop()
|
|
{:stop, :shutdown, state}
|
|
end
|
|
|
|
@impl true
|
|
def terminate(_reason, _state) do
|
|
log("Stopping...")
|
|
end
|
|
|
|
defp log(message) do
|
|
IO.puts(["[server] ", message])
|
|
end
|
|
end
|