akka系列文章目录
- akka学习教程(十四) akka分布式实战
- akka学习教程(十三) akka分布式
- akka学习教程(十二) Spring与Akka的集成
- akka学习教程(十一) akka持久化
- akka学习教程(十) agent
- akka学习教程(九) STM软件事务内存
- akka学习教程(八) Actor中的Future-询问模式
- akka学习教程(七) 内置状态转换Procedure
- akka学习教程(六) 路由器Router
- akka学习教程(五) inbox消息收件箱
- akka学习教程(四) actor生命周期
- akka学习教程(三) 不可变对象
- akka学习教程(二)HelloWord
- akka学习教程(一)简介
我们知道,整个akka的actor系统是通过消息进行传递的,之前的几个教程都是通过一个actor来给另一个actor发消息。其实还可以使用inbox消息收件箱来给某个actor发消息,并且可以进行交互。
package akka;
import akka.actor.*;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import com.typesafe.config.ConfigFactory;
import scala.concurrent.duration.Duration;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* Created by liubenlong on 2017/1/12.
*/
public class InboxTest extends UntypedActor {
private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);
public enum Msg{
WORKING, DONE, CLOSE;
}
@Override
public void onReceive(Object o) throws Throwable {
if(o == Msg.WORKING){
log.info("i am working.");
}else if(o == Msg.DONE){
log.info("i am done");
}else if(o == Msg.CLOSE){
log.info("i am close.");
getSender().tell(Msg.CLOSE, getSelf());//告诉消息发送者我要关闭了。
getContext().stop(getSelf());//关闭自己
}else{
unhandled(o);
}
}
public static void main(String [] args){
ActorSystem system = ActorSystem.create("inbox", ConfigFactory.load("akka.conf"));
ActorRef inboxTest = system.actorOf(Props.create(InboxTest.class), "InboxTest");
Inbox inbox = Inbox.create(system);
inbox.watch(inboxTest);//监听一个actor
//通过inbox来发送消息
inbox.send(inboxTest, Msg.WORKING);
inbox.send(inboxTest, Msg.DONE);
inbox.send(inboxTest, Msg.CLOSE);
while(true){
try {
Object receive = inbox.receive(Duration.create(1, TimeUnit.SECONDS));
if(receive == Msg.CLOSE){//收到的inbox的消息
System.out.println("inboxTextActor is closing");
}else if(receive instanceof Terminated){//中断 ,和线程一个概念
System.out.println("inboxTextActor is closed");
system.shutdown();
break;
}else {
System.out.println(receive);
}
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
输出结果:
[INFO] [01/12/2017 14:35:24.207] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am working.
[INFO] [01/12/2017 14:35:24.223] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am done
[INFO] [01/12/2017 14:35:24.223] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am close.
inboxTextActor is closing
inboxTextActor is closed
参考资料
- 书籍《java高并发程序设计》
- AKKA官方文档