2017-09-15 82 views
0

我正在製作可發送/接收異步消息的基本Elixir服務器/客戶端模塊。該模塊看起來像下面。Elixir:如何在handle_cast中向服務器發送通知?

defmodule Bitcoin.WorkerOne do 
use GenServer 

def start_link(opts) do 
    IO.puts " - Worker 1 started - " 
    GenServer.start_link(__MODULE__,:ok, opts) 
end 

def set_message(server, name, mid) do 
    GenServer.cast(server, {:set_message, name}) 
end 

#callbacks 
def init(:ok) do 
    names = [] 
    {:ok, names} 
end 

def handle_cast({:set_message, name},names) do 
    IO.puts "- new state is - " 
    names = names ++name 
    IO.inspect names 
    {:noreply,names} 
end 

end 

我通過iex控制檯使用啓動進程。

{:ok, pid1} = Bitcoin.WorkerOne.start_link([]) 
Bitcoin.WorkerOne.get_message(pid1, ["one"]) 

之後,狀態變爲['one'](最初爲空列表)。我想向服務器發送狀態已更新的通知。我可以在handle_cast內撥打'Genserver.cast',以便發回消息嗎?

回答

2

使用您要發送通知類型轉換時,應當包括髮送者的郵件服務器的PID,但最好使用電話與GenServer.reply/2相結合,在handle_call回調該用例返回{:noreply, state},得到保證服務器收到請求。根據您需要的保證,手動重新實現答覆是很多工作,所以您應該避免它。

+0

在handle_call的情況下,它將等待任務完成。 「{:noreply,state}」是否可以解決這個問題? – COSTA

+1

當您需要回復或保證服務器收到請求並對其進行操作時,使用來自客戶端的呼叫很重要。如果您返回'{:noreply,state}',則預計您已使用'GenServer.reply/2'回覆或將來回復。這使您可以控制何時發送答覆,同時保持呼叫提供的保證,包括處理超時和崩潰。來電者將會阻止,但您可以儘早回覆以最大限度地減少該信息,或者如果請求真的被觸發並忘記,則可以與施法者的pid一起使用施法。 – bitwalker

相關問題