Akka 中的有类型 Actor 是 Active Objects 模式的一种实现. Smalltalk诞生之时,就已经缺省地将方法调用从同步操作发为异步派发。 有类型 Actor 由两 “部分” 组成, 一个public接口和一个实现, 如果你有 “企业级” Java的开发经验, 这对你应该非常熟悉。

Akka 中的有类型 Actor 是 Active Objects 模式的一种实现. Smalltalk诞生之时,就已经缺省地将方法调用从同步操作发为异步派发。

有类型 Actor 由两 “部分” 组成, 一个public接口和一个实现, 如果你有 “企业级” Java的开发经验, 这对你应该非常熟悉。 对普通actor来说,你拥有一个外部API (public接口的实例) 来将方法调用异步地委托给其实现类的私有实例。

有类型Actor相对于普通Actor的优势在于有类型Actor拥有静态的契约, 你不需要定义你自己的消息, 它的劣势在于对你能做什么和不能做什么进行了一些限制,比如 你不能使用 become/unbecome.

有类型Actor是使用 JDK Proxies 实现的,JDK Proxies提供了非常简单的api来拦截方法调用。

注意

和普通Akka actor一样,有类型actor也一次处理一个消息。

什么时候使用有类型的Actor

有类型的Actor很适合用在连接actor系统和非actor的代码,因为它可以使你能在外部编写正常的OO模式的代码。但切记不可滥用。

工具箱

返回有类型actor扩展 Returns the Typed Actor Extension

TypedActorExtension extension =

TypedActor.get(system); //system is an instance of ActorSystem

判断一个引用是否是有类型actor代理 Returns whether the reference is a Typed Actor Proxy or not

TypedActor.get(system).isTypedActor(someReference);

返回一个外部有类型actor代理所代表的Akka actor Returns the backing Akka Actor behind an external Typed Actor Proxy

TypedActor.get(system).getActorRefFor(someReference);

返回当前的ActorContext//Returns the current ActorContext,

此方法仅在一个TypedActor 实现的方法中有效 // method only valid within methods of a TypedActor implementation

ActorContext context = TypedActor.context();

返回当前有类型actor的外部代理//Returns the external proxy of the current Typed Actor,

此方法仅在一个TypedActor 实现的方法中有效// method only valid within methods of a TypedActor implementation

Squarer sq = TypedActor.self();

返回一个有类型Actor扩展的上下文实例//Returns a contextual instance of the Typed Actor Extension

这意味着如果你用它创建其它的有类型actor,它们会成为当前有类型actor的子actor//this means that if you create other Typed Actors with this,

//they will become children to the current Typed Actor.

TypedActor.get(TypedActor.context());

具体例子及说明

package practise.akka.typedactors

import akka.dispatch.Future

import akka.japi.Option

/**

* 这个就是对外的接口,各函数就是Typed Actor的接口方法

*/

public interface Squarer {

void squareDontCare(int i); //fire-forget

Futuresquare(int i); //non-blocking send-request-reply

OptionsquareNowPlease(int i);//blocking send-request-reply

int squareNow(int i); //blocking send-request-reply

}

package practise.akka.typedactors

import akka.dispatch.Future

import akka.dispatch.Futures

import akka.actor.TypedActor

import akka.japi.Option

import akka.actor.ActorContext

import groovy.util.logging.Log4j

import akka.actor.ActorRef

/**

* 这个是接口实现。(实现akka.actor.TypedActor.Receiver接口就能接收actor发来的普通消息(非函数调用消息)。)

*/

@Log4j

class SquarerImpl implements Squarer, akka.actor.TypedActor.Receiver {

private String name;

public SquarerImpl() {

this.name = "default";

}

public SquarerImpl(String name) {

this.name = name;

}

public void squareDontCare(int i) {

log.debug("squareDontCare,fire-and-forget只接收不返回结果,与ActorRef.tell完全一致----" + i) //可以从线程号看出是异步处理的

int sq = i * i; //Nobody cares :(

//返回当前的ActorContext,

// 此方法仅在一个TypedActor 实现的方法中有效

ActorContext context = TypedActor.context();

println "context ----" + context

//返回当前有类型actor的外部代理,

// 此方法仅在一个TypedActor 实现的方法中有效

Squarer mysq = TypedActor.self();

println "--self --" + mysq

}

public Futuresquare(int i) {

log.debug("square send-request-reply Future----" + i) //可以从线程号看出是异步处理的

return Futures.successful(i * i, TypedActor.dispatcher());

}

public OptionsquareNowPlease(int i) {

log.debug("squareNowPlease send-request-reply Option----" + i) //可以从线程号看出是异步处理的

return Option.some(i * i);

}

public int squareNow(int i) {

log.debug("squareNow send-request-reply result----" + i) //可以从线程号看出是异步处理的

return i * i;

}

@Override

void onReceive(Object o, ActorRef actorRef) {

log.debug("TypedActor收到消息----${o}---from:${actorRef}")

}

}

package practise.akka.typedactors

import akka.actor.ActorSystem

import akka.actor.TypedActor

import akka.actor.TypedProps

import com.typesafe.config.ConfigFactory

import akka.japi.Creator

import groovy.util.logging.Log4j

import akka.actor.ActorContext

/**

* 这里创建Typed Actor.

*/

@Log4j

class TypedActorsFactory {

ActorSystem system

private final String config = """akka {

loglevel = "${log?.debugEnabled ?"DEBUG":"INFO"}"

actor.provider = "akka.remote.RemoteActorRefProvider"

remote.netty.hostname = "127.0.0.1"

remote.netty.port = 2552

remote.log-received-messages = on

remote.log-sent-messages = on

}"""

TypedActorsFactory(String sysName) {

this.system = ActorSystem.create(sysName, ConfigFactory.parseString(config))

}

Squarer getTypedActorDefault() {

Squarer mySquarer =

TypedActor.get(system).typedActorOf(new TypedProps(Squarer.class, SquarerImpl.class));

//这里创建的是代理类型

return mySquarer

}

Squarer getTypedActor(String name) {

Squarer otherSquarer =

TypedActor.get(system).typedActorOf(new TypedProps(Squarer.class,

new Creator() {

public SquarerImpl create() { return new SquarerImpl(name); } //这里创建的是具体的实现类型

}),

name); //这个name是actor的name:akka//sys@host:port/user/name

return otherSquarer

}

}

下面用几个测试用例实验一下

package practise.akka.typedactors

import akka.actor.ActorRef

import akka.actor.TypedActor

import akka.actor.UntypedActorContext

import akka.dispatch.Future

import com.baoxian.akka.AkkaClientNoReply

import com.baoxian.akka.AkkaServerApp

class TestTypedActors extends GroovyTestCase {

def testTypeActor() {

println("----")

TypedActorsFactory factory = new TypedActorsFactory("typedServer")

// Squarer squarer = factory?.getTypedActorDefault() //创建代理

Squarer squarer = factory?.getTypedActor("serv") //具体实现

squarer?.squareDontCare(10)

Future future = squarer?.square(10)

AkkaServerApp app = new AkkaServerApp("tmp", "127.0.0.1", 6666, "result") //这是我自己构建的接收器

app.messageProcessor = {msg, UntypedActorContext context ->

log.info("结果为" + msg)

}

app.startup()

akka.pattern.Patterns.pipe(future).to(app.serverActor) //Future的返回结果pipe到接收器中了,在log中能看到结果

println "----" + squarer?.squareNowPlease(10)?.get()

println "----" + squarer?.squareNow(10)

//返回有类型actor扩展

TypedActor.get(factory.system)

//返回一个外部有类型actor代理所代表的Akka actor

ActorRef actor = TypedActor.get(factory.system).getActorRefFor(squarer);

actor.tell("消息") //这个消息将会在SquarerImpl的onReceive方法中接收到

sleep(1000 * 60 * 10)

// TypedActor.get(factory.system).stop(squarer); //这将会尽快地异步终止与指定的代理关联的有类型Actor

TypedActor.get(factory.system).poisonPill(squarer);//这将会在有类型actor完成所有在当前调用之前对它的调用后异步地终止它

}

def testRemoteTypedActor() {

AkkaClientNoReply client = new AkkaClientNoReply("akka://typedServer@127.0.0.1:2552/user/serv")

client.send("远程消息") //这将会在SquarerImpl的onReceive方法中接收到

sleep(1000)

client.shutdown()

}

}

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

akka typed mysql_Akka2使用探索5(Typed Actors)相关推荐

  1. Akka型演员:探索接收器模式

    在上一篇文章中,我们研究了Akka Typed提供的一些基本功能. 在本文和下一篇文章中,我们将更进一步地了解一些其他功能,并通过查看Akka Typed提供的两种不同模式来做到这一点:Receive ...

  2. 【Akka】Actor模型探索

    Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们采取了" ...

  3. 【前端库】typed.js 打字机效果

    官方github 官方网站: bootstrap CDN 案例地方单击我看效果 前提 引入js库 <script type="text/javascript" src=&qu ...

  4. HTML之typed.js

    typed.js实现 HTML之typed.js 首先引入js <script src="https://cdn.bootcss.com/typed.js/2.0.9/typed.mi ...

  5. Typescript 类型的常用知识与技能

    Typescript 类型系统 本文主要整理与翻译自 lib.es5.d.ts与微软Typescript文档.MDN文档. 邮箱 :291148484@163.com CSDN 主页:https:// ...

  6. 微软office认证课程

    感谢阅读 非原创声明,根据微软课程学习理解而已 Get started with Microsoft 365 Work Smarter with Microsoft Word 与 Microsoft ...

  7. Java并发的四种风味:Thread、Executor、ForkJoin和Actor

    原文地址:Java并发的四种风味:Thread.Executor.ForkJoin和Actor 这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好的几种解决方法,Exe ...

  8. 5W字总结Spark(建议收藏)

    点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 本文目录: 一.Spark 基础 二.Spark Co ...

  9. LeetCode简单题之长按键入

    题目 你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字( ...

最新文章

  1. IDEA高级用法:集成JIRA、UML类图插件、SSH、FTP、Database管理...
  2. 以二进制的形式查看文件 Linux之od命令详解
  3. 快排,归并和Shell排序
  4. (web前端笔记)2020-12-23(ajax)
  5. 微信小程序开发系列五:微信小程序中如何响应用户输入事件
  6. C#中配置文件的使用
  7. 蔡高厅老师 - 高等数学阅读笔记 - 16 定积分的应用(旋转积、平面曲线的弧长、阿基米德螺旋、旋转体的侧面积、定积分物理应用-变力做功) -(71、72、73)
  8. Python基础学习3——集合、文件、函数
  9. CoreJava Reading Note(3:Fundamental structure)
  10. effective Java chapter 2创建和销毁对象
  11. C++使用万能头文件报错
  12. 城市级智能网联招投标项目情况全扫描(2021版)
  13. FPGA 主流芯片选型指导和命名规则(一)
  14. Springboot RabbitMQ
  15. Android手机下载的缓存视频如何找到?
  16. 步进电机和步进驱动器的介绍、接线、细分和控制方法
  17. 通信工程师出差生存指南
  18. SQL 常用的字符串函数
  19. 数据库备份数据:全量备份、增量备份
  20. AIGC火了,但它能替代红人们吗?

热门文章

  1. 04、05、06三年盘点:为了生命的意义--Surfer(新的一学期继续更新。。。。谢谢 ^_^)
  2. Android 手机震动功能的实现
  3. 【线程同步】 Java 同步块(synchronized)详细说明
  4. 班级奖学金管理系统java_jsp学生奖学金评奖评优管理系统
  5. 求职面试算法总结(感谢用心整理的小伙伴)
  6. DPDK 中断机制 eal_intr_handle_interrupts
  7. 颠覆历史!ChatGPT官方app正式登录美国苹果商店
  8. ArcGIS 栅格图层相关性分析
  9. Shiro一键登录,第三方接入免登陆
  10. windows系统可以用android,支持Windows和Android双系统的一体机你见过吗?