Новичок OutOfMemory проблема - PullRequest
       12

Новичок OutOfMemory проблема

3 голосов
/ 30 апреля 2010

Я пытаюсь создать приложение Scala типа производитель / потребитель. LoopControl просто отправляет сообщение на MessageReceiver постоянно. Затем MessageReceiver делегирует работу MessageCreatorActor (чья работа заключается в проверке карты на предмет объекта и, если она не найдена, ее создание и запуск). Каждый MessageActor, созданный этим MessageCreatorActor, связан с 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
}

1 Ответ

2 голосов
/ 30 апреля 2010

Мне интересно, действительно ли ваш код находит существующие объекты на карте?

Если он не найдет старые, он будет создавать новые MessageActors, пока не закончится память.

Попробуйте проверить это.

...