当前位置: 代码迷 >> 综合 >> Scala中(of class scala.Tuple2)异常,match case匹配失败
  详细解决方案

Scala中(of class scala.Tuple2)异常,match case匹配失败

热度:139   发布时间:2023-09-23 10:36:19.0

使用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,Scala中(of class scala.Tuple2)异常,match case匹配失败

难怪原来使用case content: PageContent一直匹配不成功。。原来message消息类型不是纯粹的就是消息本身的类型,可能还携带了actor地址。。。

 

  相关解决方案