本文重度借鉴了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. MySQL Index Condition Pushdown 原理与解析

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法.   原理: 在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysq ...

  2. 学习高性能mysql

    Mysql 的InnoDB存储引擎实现的不是简单的行级锁,实现的是MVCC,多版本并发控制,可以理解成行级锁的一个变种. InnoDB的MVCC是通过在每行纪录后面保存两个隐藏的列来实现的.这两个列, ...

  3. 10.19 qbxt国庆day3

    最近的题都莫名简单 经常AK 炼金术 [问题描述] 即使是最伟大的ACM选手也是需要足够的金钱来把妹的的.于是ZYB发明了一台炼金机器. 这台机器一共有三个功能: 1.能把a位沙子变成b位石油. 2. ...

  4. C++使用using namespace std报错分析与解决方案

    一句话概括,不能同时使用using 和include ***.h: 详细传送门:https://blog.csdn.net/m0_37876745/article/details/78565315

  5. APP设计规范

    设计师DPI指南 本指南旨在为初级到中级设计人员提供“入门”或介绍性阅读,他们希望从一开始就学习或获得有关跨DPI和跨平台设计的更多知识. 尽可能少的数学和没有不可解析的图形,只需在简短的部分中订购直 ...

  6. pycharm、idea 2018软件安装教程

    Python3.7安装: https://www.jb51.net/article/146326.htm pycharm软件: https://www.jianshu.com/p/cf77d74bef ...

  7. hdu6441 Find Integer 求勾股数 费马大定理

    题目传送门 题目大意: 给出a和n,求满足的b和c. 思路: 数论题目,没什么好说的. 根据费马大定理,当n>2时不存在正整数解. 当n=0或者1时特判一下就可以了,也就是此时变成了一个求勾股数 ...

  8. php __CLASS__、get_class()与get_called_class()的区别

    __CLASS__获取当前的类名, get_class()与上面一样,都是获取当前的类名 get_called_class()获取当前主调类的类名 当涉及到继承时,在方法中使用类名.直接贴图了 MVC ...

  9. mysql 存储引擎介绍

    一  存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻, ...

  10. Java8 流的使用示例

    foreach遍历处理 dataList.stream().forEach(index -> sb.append(dataList.get(index) + "',")); ...