使用UntypedAbstractActor时,出现message匹配不上自定义的对象,但是debug时发现类型确实是,而且用了case class,各种方法都不行
类结构,最终有效代码:
abstract class Master(latch: CountDownLatch) extends UntypedAbstractActor {
override def onReceive(message: Any) = {logger.info("master,actor is:" + self)logger.info("Master当前消息类型:" + message.getClass.getSimpleName)message match {//启动case start: String => {logger.info("=======================start================")visitedPageStore.add(start)getParser() ! visitedPageStore.getNext()}//页面case (content: PageContent, _) => {logger.info("========================page==============")getIndexer() ! content//存储待访问页面链接visitedPageStore.addAll(content.getLinksToFollow())if (visitedPageStore.isFinished()) {//完成了则提交getIndexer() ! COMMIT_MESSAGE} else {//继续获取下一个页面for (page <- visitedPageStore.getNextBatch()) {getParser() ! page}}}//索引case (indexedMessage: IndexedMessage, _) => {logger.info("====================index=================")visitedPageStore.finished(indexedMessage.getPath)if (visitedPageStore.isFinished())getIndexer() ! COMMIT_MESSAGE}//提交case (COMMITTED_MESSAGE, _) => {logger.info("======================end================")logger.info("Shutting down, finished")getContext().system.terminate()latch.countDown()}case _ => {logger.info("Unknown execution steps")}}}
}
子类: class SimpleActorMaster(latch: CountDownLatch) extends Master(latch) {}
打印当前message的类型输出如下:
Master当前消息类型:String
Master当前消息类型:Tuple2
这里第二次匹配case的时候竟然是元组类型,仔细看debug,
难怪原来使用case content: PageContent一直匹配不成功。。原来message消息类型不是纯粹的就是消息本身的类型,可能还携带了actor地址。。。