Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 新手失忆问题_Scala_Actor_Out Of Memory - Fatal编程技术网

Scala 新手失忆问题

Scala 新手失忆问题,scala,actor,out-of-memory,Scala,Actor,Out Of Memory,我正在尝试创建一个生产者/消费者类型的Scala应用程序。 LoopControl只是不断地向MessageReceiver发送一条消息。 然后,MessageReceiver将工作委托给MessageCreatorActor(其工作是检查对象的映射,如果找不到,则创建一个并启动它)。 此MessageCreatorActor创建的每个MessageActor都与一个Id关联。 最终,这就是我想要做业务逻辑的地方。 但15分钟后我的内存就用完了。 谢谢你的帮助 import scala.acto

我正在尝试创建一个生产者/消费者类型的Scala应用程序。
LoopControl
只是不断地向
MessageReceiver
发送一条消息。 然后,
MessageReceiver
将工作委托给
MessageCreatorActor
(其工作是检查对象的映射,如果找不到,则创建一个并启动它)。 此
MessageCreatorActor
创建的每个
MessageActor
都与一个Id关联。 最终,这就是我想要做业务逻辑的地方。 但15分钟后我的内存就用完了。 谢谢你的帮助

import scala.actors.Actor
import java.util.HashMap;
import scala.actors.Actor._

case object LoopControl
case object MessageReceiver
case object MessageActor
case object MessageActorCreator

class MessageReceiver(msg: String) extends Actor {

 var messageActorMap = new HashMap[String, MessageActor]
 val messageCreatorActor  = new MessageActorCreator(null, null)

 def act() {
  messageCreatorActor.start
  loop {
   react {
   case MessageActor(messageId) =>   
   if (msg.length() > 0) {         
     var messageActor = messageActorMap.get(messageId);

     if(messageActor == null) {
      messageCreatorActor ! MessageActorCreator(messageId, messageActorMap)
     }else {   
      messageActor ! MessageActor
     }
    }
   }
  }
 }
}

case class MessageActorCreator(msg:String, messageActorMap: HashMap[String, MessageActor]) extends Actor {
 def act() {
   loop {
     react {
       case MessageActorCreator(messageId, messageActorMap) =>
         if(messageId != null ) {
    var messageActor = new MessageActor(messageId);
    messageActorMap.put(messageId, messageActor)
    println(messageActorMap)
    messageActor.start
    messageActor ! MessageActor
        }
     }
   }
    }
}

class LoopControl(messageReceiver:MessageReceiver) extends Actor {
  var count : Int = 0;
  def act() {
    while (true) {
          messageReceiver ! MessageActor ("00-122-0X95-FEC0" + count)
          //Thread.sleep(100)
          count = count +1;
          if(count > 5) {
           count = 0;
          }
    }
  }
}

case class MessageActor(msg: String) extends Actor {
 def act() {
   loop {
     react {
       case MessageActor =>
         println()
         println("MessageActor: Got something-> " + msg) 
     }
   }
    }
}

object messages extends Application {

 val messageReceiver = new MessageReceiver("bootstrap")
 val loopControl = new LoopControl(messageReceiver)

 messageReceiver.start
 loopControl.start
}

我想知道你的代码是否真的在地图中找到了现有的对象

如果找不到旧的MessageActor,它会一直创建新的MessageActor,直到内存耗尽


尝试测试。

它正在地图中查找现有对象。我可以用println(…)来验证