转载:https://blog.csdn.net/liubenlong007/article/details/54377820
我们知道,整个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();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
输出结果:
[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
- 1
- 2
- 3
- 4
- 5
参考资料
- 书籍《java高并发程序设计》
- AKKA官方文档