2010-01-21 3 views
1

J'écris un client de protocole Stomp avec Java et il n'a qu'un seul thread à traiter IO. Cela signifie que le thread lit et écrit les données entrantes dans l'application. Mon problème est si j'ai besoin de mettre à l'échelle cette application à l'avenir avec multi threading et NIO, comment cela pourrait-il être arrangé?comment mettre à l'échelle ce client java simple thread?

mon fils processeur IO est appelé lien « TcpLink » et a skeletion suivant

class TcpLink implements Runnable { 

     public void run() { 
      // read data from socket and assign it to a byte buffer 
      // notify the listening application 
     } 
    } 

Si je dois permettre à plusieurs threads d'expédier les messages entrants, comment cette classe doit être changé?

merci!

+0

Est-ce un client ou un serveur? – danben

+0

Ceci est le client. –

Répondre

2

J'aime vraiment this Doug Lee presentation sur la conception de systèmes évolutifs basés autour de Java NIO.

Essentiellement, votre conception sera généralement basée autour du Reactor pattern, grâce à quoi un seul thread d'E/S tourne autour d'un certain nombre de connexions client. Si le fil d'E/S devient un jour saturé, vous pouvez envisager de cultiver les connexions d'un réacteur principal à un ou plusieurs réacteurs enfants; chaque réacteur contenant son propre fil.

Un autre point important à noter dans votre conception est que le fil d'E/S ne devrait effectuer des E/S et doit généralement envoyer des messages entrants vers un thread séparé (par exemple ExecutorService) pour faire un travail réel. Cela évite que d'autres connexions soient privées d'E/S pendant le traitement d'un message donné.

+0

Merci d'avance Adamski pour le partage d'une telle présentation et de vos connaissances ... –

1

Ce sera une meilleure idée d'écrire une classe wrapper qui gère une liste de classes TcpLink. Le rôle de la classe wrapper sera de recevoir les messages entrants et de les assigner à une instance de TcpLink waiting/feww, vous pouvez calculer le débit/TPS et créer de nouvelles instances quand vous en avez besoin. Pour l'instant vous n'en créerez qu'un seul pour que ce soit un seul.

+0

Merci beaucoup pour votre réponse Teja ... Je pense que vous voulez dire une sorte de pool de threads, n'est ce pas? Donc, je peux utiliser ExecutorService ou un autre type d'installation pour y parvenir. –