《Java高并发程序设计》学习 --7.6 消息收件箱(Inbox)

本文介绍了一个使用Akka框架中收件箱(Inbox)组件与Actor交互的示例。通过创建一个名为MyWorker的Actor,演示了如何利用收件箱发送不同消息来控制Actor的状态变化及终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Akka框架准备了一个叫做“收件箱”的组件,使用收件箱,可以很方便地对Actor进行消息发送和接收,大大方便了应用程序与Actor之间的交互。
下面定义了当前示例中唯一一个Actor:
public class MyWorker extends UntypedActor {
	private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);
	public static enum Msg {
		WORKING, DONE,CLOSE;
	}
	
	@Override
	public void onReceive(Object msg) throws Exception {
		if(msg == Msg.WORKING) {
			//System.out.println("I am working");
			log.info("I am working");
		}
		if(msg == Msg.DONE) {
			//System.out.println("Stop working");
			log.info("Stop working");
		}
		if(msg == Msg.CLOSE) {
			//System.out.println("I will shutdown");
			log.info("I will shutdown");
			getSender().tell(Msg.CLOSE, getSelf());
			getContext().stop(getSelf());
		} else 
			unhandled(msg);
	}
}
上述代码中,MyWorker会根据收到的消息打印自己的工作状态。当接收到CLOSE消息时,会关闭自己,结束运行。
而在本例中,与整个MyWorker交互的是一个邮箱:
public static void main(String[] args) {
	ActorSystem system = ActorSystem.create("inboxdemo",ConfigFactory.load("sample.conf"));
	ActorRef worker = system.actorOf(Props.create(MyWorker.class), "worker");
		
	final Inbox inbox = Inbox.create(system);
	inbox.watch(worker);
	inbox.send(worker, MyWorker.Msg.WORKING);
	inbox.send(worker, MyWorker.Msg.DONE);
	inbox.send(worker, MyWorker.Msg.CLOSE);
		
	while(true) {
		Object msg = inbox.receive(Duration.create(1, TimeUnit.SECONDS));
		if(msg == MyWorker.Msg.CLOSE) {
			System.out.println("My worker is Closing");
		} else if(msg instanceof Terminated) {
			System.out.println("My worker is dead");
			system.shutdown();
			break;
		} else {
			System.out.println(msg);
		}
	}
}
上述代码中,第5行,根据ActorSystem构造了一个与之绑定的邮箱Inbox。接着使用邮箱监视MyWorker(第6行),这样就能在MyWorker停止后得到一个消息通知。第7~9行,通过邮箱向MyWorker发送消息。
在第11~21行,输出如下:
MyWorker is starting
MyWorker is stopping
[INFO] [01/13/2017 14:16:52.565] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] I am working
[INFO] [01/13/2017 14:16:52.568] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] Stop working
[INFO] [01/13/2017 14:16:52.568] [inboxdemo-akka.actor.default-dispatcher-3] [akka://inboxdemo/user/worker] I will shutdown
My worker is Closing
My worker is dead
上述输出的第3~5行为MyWorker的输出日志,表示MyWorker Actor的工作状态。后两行为主函数main()中对MyWorker消息的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值