2010-04-30 5 views
3

Je suis en train de créer une application Scala producteur/consommateur. Le LoopControl envoie simplement un message au MessageReceiver continuellement. Le MessageReceiver puis les délégués travaillent au MessageCreatorActor (dont le travail consiste à vérifier une carte pour un objet, et s'il n'est pas trouvé, créez-en un et lancez-le). Chaque MessageActor créé par ce MessageCreatorActor est associé à un ID. Finalement, c'est là que je veux faire de la logique métier. Mais je manque de mémoire après 15 minutes. Toute aide est appréciéeNewbie OutOfMemory problème

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 
} 

Répondre

2

Je me demande si votre code est en fait de trouver les objets existants dans la carte?

S'il ne trouve jamais les anciens, il continuera à créer de nouveaux MessageActors jusqu'à épuisement de la mémoire.

Essayez de tester cela.

+0

Il trouve l'objet existant dans la carte. Je pourrais vérifier cela en utilisant un println (...) – Nick