本文重度借鉴了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) =
let msg = message :?> Message
match msg with
|ValidateError r -> printfn "%A" r
|NullInput r -> printfn "%A" r
|InputSuccess r -> printfn "%A" r
|_ -> printfn "%A" message [<Literal>]
let ExitCommand = "exit"
[<Literal>]
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 % = ) then
_consoleWriterActor.Tell(InputSuccess "Thank you, message is Valid")
else
_consoleWriterActor.Tell(ValidateError "Invalid: Odd msg")
//x.Sender.Tell(ContinueProcess) 1 type 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<ConsoleWriteActor>())
let validateActor = system.ActorOf(Props.Create<ValidateActor>(consoleWriteActor))
let consoleReadActor = system.ActorOf(Props.Create<ConsoleReaderActor>(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 处手动触发消息流转,也能实现例子中的效果。

Akka探索第二个例子by fsharp的更多相关文章

  1. Akka探索第一个例子by fsharp 1

    如何构建一套分布式程序一直是我想知道的问题. Akka就是一套用来开发分布式系统的开发库.当然开发分布式系统只是它的能力之一.除此之外高度抽象的并行运算能力,轻量级的消息系统,容错能力都是该库的特点. ...

  2. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  3. Android开发艺术探索——第二章:IPC机制(中)

    Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开 ...

  4. Android开发艺术探索——第二章:IPC机制(上)

    Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...

  5. 3、netty第二个例子,使用netty建立客户端,与服务端通讯

    第一个例子中,建立了http的服务器端,可以直接使用curl命令,或者浏览器直接访问. 在第二个例子中,建立一个netty的客户端来主动发送请求,模拟浏览器发送请求. 这里先启动服务端,再启动客户端, ...

  6. 三 akka学习 actor的例子

    (转载: http://blog.csdn.net/chenleixing/article/details/44044243 ) Java并发编程的4种风格:Threads,Executors,For ...

  7. jqGrid移动滑块时冻结首列和第二列例子

    js代码如以下代码:在initAllGrid函数colModel1加入属性设置:frozen:true:然后在_initGrid('task_con_grid_div',colModel1)函数里面加 ...

  8. HTTP/2探索第二篇——工具及应用

    版权声明:本文由张浩然原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/88 来源:腾云阁 https://www.qclou ...

  9. AKKA 笔记 - 有限状态机 -2

    AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...

随机推荐

  1. P1579 哥德巴赫猜想(升级版)

    程序是人类的财富!!11 ------------------------------------------- 题目链接:MIKU OK,Let's gi; -------------------- ...

  2. 基础线程机制--Daemon,sleep(),yield()

    Daemon   守护线程是程序运行时在后台提供服务的线程,不属于程序中不可或缺的部分,当所有非守护进程执行完成时,程序也就终止,同时会杀死所有的守护进程.main()属于非守护线程.可以使用setD ...

  3. UICollectionView的基本使用 collectionView

    #pragma mark -- 创建CollectionView - (void)createCollectionView{ //关闭自适应 self.automaticallyAdjustsScro ...

  4. Hanlp(汉语言处理包)配置、使用、官方文档

    配置使用教程:https://github.com/hankcs/HanLP Hanlp官方文档:http://www.hankcs.com/nlp/hanlp.html 参考API:http://h ...

  5. input只能输入非负数

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. git 合并某个提交commit到指定的分支上

    https://blog.csdn.net/anhenzhufeng/article/details/77962943 git checkout master git cherry-pick 62ec ...

  7. 德国生活tips

    提要: 在德国生活也近7个月的时间了,简单给准备来德国留学,生活或者是旅游的人写一些小tips.想到什么就写什么咯. (1)德国交通篇 在德国,交通是第一要点,一般大家都会看到城市里有Straßenb ...

  8. Dockerfile的书写规则和指令的使用方法

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...

  9. Linux环境搭建禅道项目管理工具

    1.开源版安装包下载 [root@iZbp ~]# wget http://dl.cnezsoft.com/zentao/9.0.1/ZenTaoPMS.9.0.1.zbox_64.tar.gz 2. ...

  10. Web 2.0 浏览器端可靠性测试第1部分(浏览器端可靠性测试的概念和背景)

    Web 2.0 是一个体现当代网络技术发展趋势的流行概念.它使得基于 Web 的信息交互和用户间协作性更加灵活和丰富.很多的社交网站.博客.wiki,都是 Web 2.0 技术的典型应用. 我们知道, ...