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 % 2 = 0) 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 处手动触发消息流转,也能实现例子中的效果。

时间: 2024-10-27 05:19:56

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

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

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

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

Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvider ContentProvider是Android中提供的专门用来不同应用之间数据共享的方式,从这一点来看,他天生就是适合进程间通信,和Messenger一样,ContentProvider的底层实现同样也是Binder,由此可见,Binder在Android系统中是何等的重要,虽然Conten

Android深度探索第二章总结

Android深度探索第二章主要是搭建Android开发环境.首先我们要准备好开发工具,有:JDK.Eclipse.ADT.CDT.Android SDK.Android NDK.交叉编译环境.Linux内核源代码.用于调试开发板的串口工具minicom.1.安装JDK.将下载好的JDK解压,在终端输入gedit  /etc/profile打开profile文件后输入export PATH=.:/developer/jdk6/bin:$PATH然后保存,再在终端中输入source /etc/pr

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

Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开始详细的分析各中跨进程的方式,具体方式有很多,比如可以通过在Intent中附加extras来传递消息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持扩进程访问的,所以通过Socket也可以实现IPC,上述的各种方法都能实现I

第一个例子没有问题,第二个例子出现了

第一个是hibernate基本的配置hibernate.cfg.xml ->*.hbm.xml... Hibernate: insert into user (id, name, password, say) values (null, ?, ?, ?) 第二个是hibernate的annotation的基本基本配置就是hibernate.cfg.xml ->实体类中加注解@entity... Hibernate: insert into Teacher (name, password, sa

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

版权声明:本文由张浩然原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/88 来源:腾云阁 https://www.qcloud.com/community 由于不同环境过于复杂,本文仅基于Mac OS和Linux来讲解工具及应用. 一.HTTP/2环境搭建所需软件概览 本文需要安装的软件为(Mac用户请使用homebrew来安装,括号里都是Mac的安装方式) curl (brew install nghttp2 -wit

Android深度探索——第二章读书笔记及心得

Android开发环境搭建 ——第二章读书笔记及心得 通过本章的学习了解了如何对Ubuntu Linux下的Android进行搭建,包括搭建Android应用程序开发环境.Android NDK开发环境和交叉编译环境的搭建.了解了搭建Android环境所需要的各种东西,了解了配置ADT的必要性—以便ADT能够找到Android SDK.知道了底层开发所需要的各种工具.学会了如何在Ubuntu下安装JDK.以及编译交叉编译环境,当初在学习Linux交叉环境编译的时候就不是特别成功,中间出了很多的错

Android深度探索第二章读后感

这章主要讲述了 Ubuntu Linux环境下的Android开发环境的配置.这是我在互联网上找到的配置过程联系书上的介绍完成的步骤 一.JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 目前最新版本:jdk-8-linux-x64.tar.gz 使用“tar -zxvf”解压后,假设解压后主目录为“/home/szyzln/jdk1.7.0_51” 1.sudo gedit /etc/prof

Android深度探索--第二章读后感

第二章中,在目标开发中和Android模拟器上测试驱动时,需要执行shell.h 脚本文件或 adb shell 命令进入相应平台的终端,在shell.h脚本在/root /drivers 目录之中.在这里讲的脚本文件都是使用insmod命令安装Linux驱动的,除了该命令意外,使用modprobe命令也是可以安装Linux驱动.Insmod和modprobe 的区别是modprobe命令可以检查驱动模块的依赖性.对于一个Linux驱动程序,一开始可以在Ubuntu Linux上做前期开发和测试