akka从1.2升级到现在的2.0.2后有了很大的改变。现在摸索一下如何使用。
Remoting可以方便地用于服务器之间通信。akka1.2可以使用clientActor.sendRequestReply将消息发送到服务器端,并且同步获取服务器端的返回消息。但是akka2已经不能这么用了,akka2使用tell方法给另一个Actor发消息。
tell有两个重载方法:
/**
* Sends the specified message to the sender, i.e. fire-and-forget
semantics.<p/>
* <pre>
* actor.tell(message);
*
</pre>
*/
final def tell(msg: Any): Unit = this.!(msg)(null:
ActorRef)
只发送,不管其他,也不接收相应。actor.tell(msg)----给actor发送msg消息
/**
* Java API. <p/>
* Sends the specified message to the
sender, i.e. fire-and-forget
* semantics, including the sender reference if
possible (not supported on
* all senders).<p/>
* <pre>
*
actor.tell(message, context);
* </pre>
*/
final def tell(msg:
Any, sender: ActorRef): Unit = this.!(msg)(sender)
只发送消息,并告诉对方你可以给我指定的sender回复消息。actor.tell(msg,sender)----给actor发送msg消息,actor处理时可以给sender回复消息。
所以akka2中actor是对等的。有消息来回发送的akka应用最好部署在对等互通的网络环境中。如果一个应用部署在内网,一个部署在外网,那么内网的actor给外网发消息没问题,但是外网的actor想给内网的actor回复消息就不行了。
另外,因为remoting的host最好指定成具体的ip或域名或hostname,不要指定成”0.0.0.0”,这样才方便定位远程actor。host和port在配置文件中指定。
注意区别Deploy,Deploy是指将本地Actor发布到远程akka Server上,withDeploy的参数RemoteScope指的是远程Server的ip、端口、sysName。并不是启动本地Server。
serverActor = system.actorOf(new Props(Server.class).withDeploy(new Deploy(new RemoteScope(new Address("akka", Server.AkkaSystemName, "127.0.0.1", 8888);))), "simple");
客户端可以直接用serverActor发消息,也可以通过路径查找,用actorFor(akka://${远程sysName}@${远程akka服务地址}/remote/${被发布的sysName}@${被发布的akka的地址(ip、端口)}/user/${actorOf第二个参数指定的路径})发消息。注意消息是在服务端收到。
现在来看看具体的例子:
首先引用typesafe的仓库:
<repository>
<id>typesafe-releases</id>
<url>http://repo.typesafe.com/typesafe/releases</url>
</repository>
加入依赖包:<akka.version>2.0.2</akka.version>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-kernel</artifactId>
<version>${akka.version}</version>
</dependency>
首先定义ServerActor:
import akka.remote.RemoteScope
import akka.actor.*
import
com.typesafe.config.ConfigFactory
class Server extends UntypedActor {
static final String AkkaSystemName = "xw"
LoggingAdapter log =
Logging.getLogger(getContext().system(), this);
@Override
void onReceive(Object message) {
log.debug("server收到消息----${message}----self:${getSelf()},sender:${getSender()}")
getSender().tell(message)//给客户端actor发送消息
}
}
然后定义服务端应用,来启动ServerActor
import akka.kernel.Bootable
import akka.actor.ActorSystem
import
akka.actor.Props
import akka.actor.ActorRef
import akka.actor.Address
import akka.actor.Deploy
import akka.remote.RemoteScope
import
com.typesafe.config.ConfigFactory
class ServerApp implements Bootable {
ActorSystem system
ActorRef serverActor
ServerApp() {
system =
ActorSystem.create(Server.AkkaSystemName,
ConfigFactory.load().getConfig("server"))
Address addr = new
Address("akka", Server.AkkaSystemName, "10.68.15.16", 8888);
serverActor = system.actorOf(new Props(Server.class), "server");
// serverActor = system.actorOf(new Props(Server.class).withDeploy(new
Deploy(new RemoteScope(addr))), "simple");
}
void startup() {
}
void shutdown() {
system.shutdown()
}
}
指定它加载“server”配置。需要在classpath下的application.conf中添加:
server {
akka {
//loglevel = "DEBUG"
actor
{
provider =
"akka.remote.RemoteActorRefProvider"//这里指定使用RemoteActor
}
remote {
transport =
"akka.remote.netty.NettyRemoteTransport"
netty {
hostname = "10.68.15.16"//"0.0.0.0"//指定系统绑定的host
port = 8888//指定系统绑定的端口
}
}
}
}
现在只需要new ServerApp()将服务启动即可。
客户端很简单:
ActorSystem.create(Server.AkkaSystemName,
ConfigFactory.load().getConfig("client")).actorFor("akka://xw@10.68.15.16:8888/user/server").tell("hello,I'm
client")
客户端也需要加载配置文件:
client {
akka {
actor {
provider =
"akka.remote.RemoteActorRefProvider"
}
}
}
这里需要注意:
1、必须指定provider为RemoteActorXXX
2、客户端只发不收消息时,ActorSystem的name没有要求。需要收消息时,如果和服务端相同则可能出问题。遇到问题时改下ActorSystem的那么试一下。
经过试验,如果服务端启多个ActorSystem和akka端口是没问题的。akka1.2中同一个进程不能启多个akka端口。
分享到:
相关推荐
1. **Actor系统**:Akka的核心是Actor系统,它是所有Actor的容器。在使用Akka时,你需要创建一个ActorSystem实例,如`ActorSystem("MySystem")`,这将为你的应用提供上下文。 2. **Actor**:Actor是一种并发实体,...
Akka是一个用于构建分布式、高并发、容错性应用...《Akka实战》一书不仅涵盖了Akka的核心概念和技术细节,还提供了大量实战案例和最佳实践,是那些希望深入了解并使用Akka构建高性能并发应用程序的开发者的重要资源。
1. **Actors**:Actors是Akka的基础,它们负责处理消息并可以创建子Actor。在Akka.NET中,你可以使用`ActorSystem`来创建和管理Actor。Actor通过`Receive`方法定义其行为,即它如何处理不同类型的消息。 2. **消息...
2. Akka ActorSystem:创建和配置ActorSystem以支持远程调用。 3. 配置文件:编写`application.conf`以启用远程部署和指定TCP设置。 4. 服务端和客户端Actor:定义Actor类,实现消息处理逻辑。 5. 远程Actor引用:在...
本教学内容将详细介绍 Akka 的基本概念、核心功能以及如何在 Java 中使用 Akka 来构建强大的应用程序。 ##### 1.1 什么是 Akka? Akka 是一个基于 Actor 模型的并发框架,由 Typesafe 开发,旨在帮助开发者构建高度...
1. **Actor系统**:Akka的核心是Actor模型,它是一种处理并发和分布式计算的抽象方式。每个Actor都是一个独立的执行单元,有自己的邮箱来接收消息,并且只允许单线程访问,确保了线程安全。Actor系统是这些Actor的...
文档中还可能包含了Akka的具体API使用示例,最佳实践,以及在实际项目中使用Akka的案例研究。这些信息将对理解Akka框架的核心概念和特性,以及如何在Scala项目中应用这些概念提供帮助。对于那些希望提升并发编程技巧...
Camel 是一个基于路线和端点的规则引擎,这部分讲解了如何在 Akka 中使用 Camel。 #### 7. Utilities 这部分介绍了 Akka 提供的一些实用工具,包括事件总线、日志记录、调度器等。 #### 8. How To: Common ...
使用 Akka Actors 的简单聊天系统(Akka Remoting) 聊天框演员 管理客户端参与者和客户端参与者注册到聊天框参与者。 ChatBox 演员的 IP 可供客户端演员使用。 ChatBox actor 监视每个向其注册的 Client actor,并...
Akka is a distributed computing toolkit that enables developers to build correct concurrent and distributed applications using Java and Scala with ease, applications that scale across servers and ...
- **Remoting**:Akka Remoting是实现集群通信的基础,它允许Actor跨节点进行消息传递。 - **Serialization**:在分布式环境中,消息的序列化和反序列化是非常重要的步骤。Akka提供了多种序列化方式,如Java序列化、...
1. **Actor系统**:Akka中的核心组件是Actor系统,它是所有Actor的容器,负责管理和调度Actor。每个Actor系统都有一个根Actor,其他Actor都是其子Actor。 2. **Actor**:Actor是Akka的基本执行单元,它通过消息传递...
1. Akka是一个基于Scala的框架,由Jonas Boner主持开发。 2. Akka是为Java程序员提供的并发解决方案,兼容其他JVM语言。 3. Akka提供了大量易用的API,可以帮助开发者更高效地编写代码。 在【部分内容】中,提到了...
Akka 提供了一种易于理解和使用的模型来处理现代软件系统中的高并发需求。随着硬件的发展,多核处理器已经成为标准配置,因此如何有效地利用这些核心成为了一个重要的问题。Akka 通过 Actor 模型来实现这一点,Actor...
akka-kryo-serialization, 基于Kryo的Akka序列化 akka-kryo-serialization-- Scala 和Akka基于kryo的序列化程序这个库为 Scala 和Akka提供定制的基于kryo的序列化程序。 它可以用于更高效的akka远程处理。它还可以...
`Commons` 可能包含了一些通用的 Actor 类或工具类,`packages` 文件夹可能包含了 Akka.NET 相关的 NuGet 包,而 `WindowsFormsApp1` 可能是一个演示如何使用 Akka.NET 实现分布式数据传输的 Windows 应用程序。...
第 1 章 初识 Actor:Akka 工具集以及 Actor 模型的介绍。 第 2 章 Actor 与并发:响应式编程。Actor 与 Future 的使用。 第 3 章 传递消息:消息传递模式。 第 4 章 Actor 的生命周期—处理状态与错误:Actor 生命...
2. Streams:Akka Streams是一个处理数据流的API,支持背压,可以处理高吞吐量的实时数据流。 3. Persistence:允许Actor保存其状态并在故障后恢复,实现持久化。 4. Cluster:用于构建分布式应用,支持节点间的自动...