Akka探索第二个例子by fsharp
本文重度借鉴了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的更多相关文章
- Akka探索第一个例子by fsharp 1
如何构建一套分布式程序一直是我想知道的问题. Akka就是一套用来开发分布式系统的开发库.当然开发分布式系统只是它的能力之一.除此之外高度抽象的并行运算能力,轻量级的消息系统,容错能力都是该库的特点. ...
- Android艺术开发探索——第二章:IPC机制(下)
Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...
- Android开发艺术探索——第二章:IPC机制(中)
Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开 ...
- Android开发艺术探索——第二章:IPC机制(上)
Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...
- 3、netty第二个例子,使用netty建立客户端,与服务端通讯
第一个例子中,建立了http的服务器端,可以直接使用curl命令,或者浏览器直接访问. 在第二个例子中,建立一个netty的客户端来主动发送请求,模拟浏览器发送请求. 这里先启动服务端,再启动客户端, ...
- 三 akka学习 actor的例子
(转载: http://blog.csdn.net/chenleixing/article/details/44044243 ) Java并发编程的4种风格:Threads,Executors,For ...
- jqGrid移动滑块时冻结首列和第二列例子
js代码如以下代码:在initAllGrid函数colModel1加入属性设置:frozen:true:然后在_initGrid('task_con_grid_div',colModel1)函数里面加 ...
- HTTP/2探索第二篇——工具及应用
版权声明:本文由张浩然原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/88 来源:腾云阁 https://www.qclou ...
- AKKA 笔记 - 有限状态机 -2
AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...
随机推荐
- 818. Race Car
Your car starts at position 0 and speed +1 on an infinite number line. (Your car can go into negati ...
- (原创)Problem F: WPF的三位数
Description PF哥是一个爱说骚话的骚年,今天他决定要用阿拉伯数字来说骚话,他将1,2,…,9共9个数字分成了三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例 他要说的骚话就是 ...
- SQL事务对并发处理的支持
前言 继上次技术分享后,学到了关于mysql事务的许多新知识,感觉还是蛮有收获的.后来反过来想想,这些东西其实我们都接触过,最起码在自学考试的数据库系统原理那本书里面对事务的讲解,在里面就提到了事务的 ...
- 【bzoj2751】[HAOI2012]容易题(easy) 数论-快速幂
[bzoj2751][HAOI2012]容易题(easy) 先考虑k=0的情况 那么第一个元素可能为[1,n] 如果序列长度为m-1时的答案是ans[m-1] 那么合并得 然后同理答案就是 k很小 而 ...
- vue脚手架的搭建
另一博客地址:https://segmentfault.com/a/1190000016451376 一.基础的知识 1.html 2.js 3.css二.搭建项目过程--windows系统1.nod ...
- Mysql 别名
一.列别名 1.要给列添加别名,可以使用AS关键词后跟别名,例:SELECT [column_1 | expression] AS descriptive_name FROM table_name; ...
- CF796A Buying A House 模拟
Zane the wizard had never loved anyone before, until he fell in love with a girl, whose name remains ...
- 过河卒 NOIp 2002 dp
题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦 ...
- HTTP协议和WebSocket协议(一)
转自:https://www.jianshu.com/p/0e5b946880b4# HTTP HTTP的地址格式如下: http_URL = "http:" "//&q ...
- 2.mybatis 的列名与数据库字段不对应
mybatis 的列名与数据库字段不对应 1.别名 映射文件 : BlogMapper.xml <mapper namespace="com.xms.mybatis.mapper.Bl ...