Akka探索第二個例子by fsharp

2022-08-24 09:42:14 字數 2970 閱讀 8618

本文重度借鑑了github上akkabootcamp教程。

先上**

open

akka

open

akka.actor

open

system

type

message =

|continueprocess

| inputsuccess of

string

| inputerror of

string

| nullinput of

string

| validateerror of

string

type

consolewriteactor() =

inherit

untypedactor()

override

x.onreceive(message) =

letmsg = message :?> message

match msg with

|validateerror r -> printfn "%a"

r |nullinput r -> printfn "%a"

r |inputsuccess r -> printfn "%a"

r |_ -> printfn "%a"

message

[>]

let exitcommand = "

exit

"[>]

let startcommand = "

start

"type

validateactor(consolewriteractor: iactorref) =

inherit

untypedactor()

let_consolewriteractor = consolewriteractor

override

x.onreceive(message) =

let msg = message :?> string

if(string.isnullorempty(msg)) then

_consolewriteractor.tell(nullinput

"no input receive")

else

if (msg.length % 2 = 0) then

_consolewriteractor.tell(inputsuccess

"thank you, message is valid")

else

_consolewriteractor.tell(validateerror

"invalid: odd msg")

1type

consolereaderactor(validateactor:iactorref) =

inherit

untypedactor()

let_validateactor = validateactor

override

x.onreceive(message) =

if(message.equals(startcommand)) then

printfn

"start now!

"else

let uinput = message |> string //2

//let uinput = console.readline()

if((not <| string.isnullorempty(uinput)) && uinput = exitcommand) then

untypedactor.context.system.terminate() |> ignore

else

_validateactor.tell(uinput)

let system = actorsystem.create "

my-system

"let

consolewriteactor = system.actorof(props.create())

letvalidateactor = system.actorof(props.create(consolewriteactor))

letconsolereadactor = system.actorof(props.create(validateactor))

consolereadactor.tell(startcommand)

consolereadactor.tell("aa

")consolereadactor.tell("")

consolereadactor.tell(

"hello

")system.terminate()

這裡**做了這樣幾件事

1.從控制台獲取使用者輸入

2.將使用者輸入進行驗證

3.將驗證後的資料根據類別進行輸出

這裡我們使用了consolereaderactor,validateactor和consolewriteactor來分別進行任務1-3的處理。因為三者之間僅通過event進行通訊,所以可以很好的解耦系統。不同的actor也可以部署到不同的機器上以分布式的方式進行部署執行。

message類是驗證後資料的類別,用fsharp的discriminated unions相較於c#可以更簡潔的表述簡單的類別資訊。

各類中onreceive是每個actor的核心所在,表述該actor所代表的狀態機。最近在思考設計的過程中越來越覺得狀態機與事件是很多系統的核心。事件或者可以認為是系統的功能介面,代表著系統的外在表現。狀態機則是系統內在的靈魂,在其合法的狀態之間跳轉,遊蕩。突然想到兩者能結合麼?狀態事件?事件狀態機?以後查查資料。

prop生成actor不能使用fsharp的expr,以後再找找解決方案。

上面的例子在fsi中控制台的輸入似乎不能很好的處理。我在注釋1,2 處手動觸發訊息流轉,也能實現例子中的效果。

第二個例子 讀和寫

讀和寫是軟體中很普遍的行為,提起它們會立即想到讀寫檔案 快取 比如位元組或字串切片 標準輸入輸出 標準錯誤以及網路連線 管道等等,或者讀寫我們的自定義型別。為了讓 盡可能通用,go 採取了一致的方式來讀寫資料。io 包提供了用於讀和寫的介面 io.reader 和 io.writer type re...

第二個作業!

作業要求 從鍵盤輸入乙個四位正整數。首先分離出該正整數中的每一位數字,並按逆序顯示輸出各位數字 然後用分離出的每位數字組成乙個最大數和乙個最小數,並顯示輸出。例如,若輸入的四位正整數為3175。按逆序顯示輸出分離出的各位數字為5713 組成的最大數為7531,組成的最小數為1357。具體要求 1 輸...

第二個系統

在進入工作後,參與的第二系統,也剛好是乙個失敗的專案重新再設計的乙個專案。全程參與了設計討論和相關功能模組的實現。到最後證明,這個系統依舊是失敗的。事隔了1年多了,回頭看問題,希望能看明白它。首先,整個團隊太年輕了。不是剛畢業沒多久,就是工作了才一年。其次,需求的失控,不懂得拒絕 因為是進入工作不久...