환경을 감시하고 시그널을 방출하는 프로세스 (SPEC §5).
poll/1이 주기(:interval ms)마다 호출되어 환경을 확인하고, 조건이 맞으면
시그널을 방출한다. poll은 상태를 들고 다니므로 이전 관측과 비교해 변화를 감지할 수 있다.
defmodule MyApp.DocsWatch do
use ElGraph.Sensor, interval: 5_000
@impl true
def poll(last_size) do
size = total_size()
if last_size && size != last_size do
{:signal, %ElGraph.Signal{type: "docs.changed", data: %{size: size}}, size}
else
{:quiet, size}
end
end
end
{:ok, _} = MyApp.DocsWatch.start_link(target: my_agent) # Agent로 시그널 dispatchdispatch 대상: :target(Agent server — send_signal 호출) 또는 :on_signal(함수).
:interval 미지정 시 자동 폴링 없이 tick/1(수동 트리거)로만 동작한다.
Summary
Functions
센서를 동기적으로 한 번 폴링한다 (테스트/수동 트리거).
Types
@type sensor_state() :: term()
Callbacks
@callback init_state(opts :: keyword()) :: sensor_state()
초기 센서 상태. 기본 nil.
@callback poll(sensor_state()) :: {:signal, ElGraph.Signal.t(), sensor_state()} | {:quiet, sensor_state()}
환경을 확인한다. 시그널을 낼지(+다음 상태) 조용히 있을지 결정한다.
Functions
@spec tick(GenServer.server()) :: :ok
센서를 동기적으로 한 번 폴링한다 (테스트/수동 트리거).