在开发初期,业务单一、系统简单,一台机器或许就能支撑,这个时候,单机上的任务大多直接调用API的方式就能完成。然而当业务需求日益增多,功能逐渐复杂化,我们就需要考虑把项目拆分成分布式环境,这时,多系统通信就需要通过网络实现。JDK内置的并发包在单机上游刃有余,在分布式环境中,就不是那么完美了。Akka通过Actor很好的解决了远程通信问题。
Actor初识
Akka中,Actor使用消息传递进行通信,完成任务。Actor编程,不同于之前通过对象调用完成某个功能,它采用“问答”式API进行通信,这种方式更加贴近日常生活,易于理解。另外,使用Actor,不是操作Actor对象,而是操作它的引用对象(ActorRef),在Akka中,ActorRef对Actor做了很好的封装,防止外界对Actor的状态进行修改。
下面,来一个小示例认识一下actor:
首先,我们创建一个maven project,并在pom.xml中引入Akka依赖:
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.11</artifactId>
<version>2.5.16</version>
</dependency>
定义Actor:
public class ActorDemo extends AbstractActor {
private final LoggingAdapter logger = Logging.getLogger(getContext().getSystem(), this);
@Override
public Receive createReceive() {
return receiveBuilder().match(String.class, s -> {
logger.info("小明:" + s);
}).matchAny(other -> {
logger.info("其它未知消息:" + other);
}).build();
}
public static void main(String[] args) {
ActorSystem system = ActorSystem.create("system");
ActorRef demo = system.actorOf(Props.create(ActorDemo.class), "actorDemo");
demo.tell("hello world",ActorRef.noSender());
final Integer other=20;
demo.tell(other,ActorRef.noSender());
}
}
执行结果:
[INFO] [09/22/2018 10:35:54.295] [system-akka.actor.default-dispatcher-4] [akka://system/user/actorDemo] 小明:hello world
[INFO] [09/22/2018 10:35:54.296] [system-akka.acto