如果你想在Akka之上添加feature,一个优雅灵活的工具是Akka Extensions,它属于Utilities实用工具集。Extensions 包括两个构件:Extension 和 ExtensionId[T <: Extension] —— 后者用于对接你的T和Akka Extensions.
百望山 若无闲事挂心头,便是人间好时节Extension是单例/ActorSys(不是集群单例,是本地单例)、每ActorSystem只加载一次,需要自己保证线程安全,注意它是由Akka托管的。可以配置你的Extension是按需加载还是随ActorSystem的创建自动加载。
你需要先定义你的业务T:Extension,为了让应用能找到你的Extension还需要创建一个ExtensionId,酌情实现三个模板方法:
1)lookup方法:用于定位ExtensionId、返回自身即可,这样当ActorSystem启动时即可找到Extension ;
2)createExtension方法:供Akka调用、实例化我们的Extension;
3)供Java调用的get方法,用于获取Extension实例,可以不写;
2020-02-02使用时只要调用ExtensionId(actorSys)即可得到Extension、之后调用你的业务方法即可,在actor内部亦可使用,实际上Extensions的基本意图就是为系统内actor提供一个方便的可供调用的业务单例,扩展用法可以说就随心所欲了。这个单例内的方法不适合actor style实现,比如需要实现一个long running 的Server,监听端口,以IO TCP为例:
object Tcp extends ExtensionId[TcpExt] with ExtensionIdProvider;
class TcpExt(system: ExtendedActorSystem) extends IO.Extension;
使用时借助akka.io.IO工具对象:IO(Tcp)直接得到TcpExt(通过ExtensionId.apply方法),IO工具对象做了两点定制:
1、单独实现了自己的IO.Extension extends akka.actor.Extension ,很简单只是定义了一个manager: ActorRef,Akka IO对所有IO交互协议都要求必须具备唯一的manager Actor;
2、IO对象的apply方法直接返回这个manager Actor.
实际上我们在开发actor项目的时候,我们不止需要actor style部分,我们还不能完全扔掉传统程序,有可能会遇到两种特殊需求:
1、需要一个long running Server:至少得有一个线程监听端口,同时它还要能无缝地与ActorSys打交道、与各个actor通讯、反之各个actor也要能够与它通讯,它充当actorSys与外部系统之间通讯的桥梁;
2、需要在actor中动态控制一个Server,但是又不能阻塞这个actor;
Extension就可以实现这种需求,而且它实际上很灵活:The sky is the limit! By the way, did you know that Akka’sTyped Actors,Serializationand other features are implemented as Akka Extensions?
比如我们要实现自己的某种Server,也可以按照Extension 方式来实现,比如ChanaMQ的Amqp Server. 实现方式除了Extensions还有一种,那就是在引导程序部分来做,也就是在创建ActorSystem的Main程序中,除了启动ActorSystem,还可以启动其他Server.
把应用特定配置作为Akka配置的例子:
这是一段应用myapp独有的配置我们可以写一个如下的Extension :
系统中的任何actor都可以十分方便地拿配置再为它写一个如下ExtensionId :
ExtensionId是面子、Extension是里子;面子千篇一律、里子才是你的内容; 在actor中就可以用了,不用你说我也知道这很鸡肋其实你可以直接:system.settings.config.getConfig("myapp");这个例子只是给你演示在你的actor中可以随时随地访问Extension还有一种情况是一些第三方库可以利用这个机制默认直接注册到ActorSys,启动即加载:
akka.library-extensions += "docs.extension.ExampleExtension"
GP项目脚本单独启动一个master时的重要输出:
listening on addresses :[akka.tcp://master@127.0.0.1:3000]
InMemoryKVService: We cannot find group gearpump_kvservice_master_group
AppManager: Application Manager started. Ready for application submission...
ClusterSingletonProxy: Singleton identified at [akka://master/user/singleton/masterwatcher/master]
网友评论