sbt项目现有Scala编写的Akka Actor能否新增Java类编写的Actor?
问题描述
我已搭建一个sbt项目,使用Spray实现API功能,基于Scala语言的Akka框架编写Actor。我当前遵循的Actor编写模式如下:
def receive = { case message: DataActorMessage => message match { case m: GetMessage => { ... } } package message { sealed trait DataActorMessage case class GetMessage() extends DataActorMessage . . . }
目前项目中所有Actor均为Scala编写,请问能否新增单独的Java类来编写新的Actor?
问题解答
完全可以在现有项目中新增Java类实现新的Actor,Akka本身同时兼容Scala和Java两套API,两种语言编写的Actor可无缝交互,不存在兼容性障碍。
实现注意事项
- sbt原生支持Scala、Java混合编译,你只需要将新增的Java代码放入
src/main/java目录,原有Scala代码保留在src/main/scala目录即可,sbt会自动按正确顺序完成两种语言的编译工作 - 现有Scala代码中定义的消息类型(比如示例中的
DataActorMessage及其子类)可以直接在Java代码中导入使用,不需要额外适配处理 - Java编写Akka Actor需要继承
AbstractActor基类,重写createReceive方法定义消息处理逻辑,基础写法示例如下:
import akka.actor.AbstractActor; import message.DataActorMessage; import message.GetMessage; public class CustomJavaActor extends AbstractActor { @Override public Receive createReceive() { return receiveBuilder() .match(GetMessage.class, m -> { // 对应GetMessage的处理逻辑 }) .match(DataActorMessage.class, msg -> { // 其他DataActorMessage子类的通用处理逻辑 }) .build(); } }
- 原有Scala代码调用Java编写的Actor和调用原生Scala Actor的方式完全一致,直接通过
actorOf方法创建实例即可,消息传递也没有额外限制。
小提示:如果你使用的是较早版本的Akka,需要注意对应版本的Java API写法适配,高版本Akka统一使用
AbstractActor作为Java Actor的基类即可。
内容的提问来源于stack exchange,提问作者Dharmesh Mehta
相关产品推荐
相关产品推荐

