2011-07-28 3 views
1

potentiellement une question-- très stupidecontrôle Akka threadpool fils

Est-il possible de personnaliser AKKA/acteurs Scala tels que vous contrôlez les fils qui sont utilisés par les acteurs? par exemple. pouvez-vous initialiser votre propre ensemble de threads à utiliser dans le pool de threads, ou sinon contrôler/modifier les threads?

Répondre

4

Dans Akka, le pool de threads est géré via une instance de MessageDispatcher. Vous pouvez définir le répartiteur que vous voulez acteurs facilement:

class MyActor(dispatcher: MessageDispatcher) extends Actor { 
    self.dispatcher = dispatcher 
    ... 
} 

Fournir votre propre distributeur, vous pouvez étendre akka.dispatch.MessageDispatcher (voir la mise en œuvre des répartiteurs existants pour des exemples). Ici vous pouvez jouer directement avec les discussions.

Bien sûr, il est dangereux de mettre la logique métier dans un répartiteur, car il peut briser le modèle d'acteur et d'augmenter le nombre de bugs d'accès concurrentiel ...

-1

J'ai essayé de le comprendre moi-même, mais les coutures que les gars à Akka ne veulent pas que la gestion des threads soit exposée au public.

ThreadPoolConfig - la classe qui est responsable de la création d'instances ExecutorService est une classe de cas avec la méthode createExecutorService() a déclaré finale!

final def createExecutorService(threadFactory: ThreadFactory): ExecutorService = { 
    flowHandler match { 
     case Left(rejectHandler) ⇒ 
     val service = new ThreadPoolExecutor(...) 
     service 
     case Right(bounds) ⇒ 
     val service = new ThreadPoolExecutor(...) 
     new BoundedExecutorDecorator(service, bounds) 
    } 
    } 

Donc, je ne vois pas de moyen facile de fournir votre propre ExecutorService.

+0

Ceci n'est pas correct, vous pouvez écrire votre propre implémentation de MessageDispatcher (étendre le trait) et le passer aux Acteurs comme dans la réponse paradigmatique. Dans l'implémentation de MessageDispatcher, vous pouvez choisir d'utiliser n'importe quel executorservice. La méthode que vous mentionnez est uniquement utilisée par ExecutorBasedEventDrivenDispatcher. –

+0

Comment puis-je faire cela si le trait MessageDispatcher a quelque chose comme ceci ** private [akka] def dispatch (invocation: MessageInvocation): Unité ** – Alex

+0

@Raymond Roestenburg ** private [akka] def start(): Unité * * Comme je comprends c'est la méthode privée de paquet et Cannod être accessible en dehors de Akka. – Alex