使用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地址。。。