2017-02-02 1 views
1

Je programme une application Big Data dans laquelle deux threads s'exécutent simultanément. Thread A reçoit des données du réseau et les place comme JSONOBJECT dans un BlockingQueue. Thread B, une goulotte d'orage, lit ensuite à partir de BlockingQueue et les traite.partage une BlockingQueue dans une goulotte d'orage

Je passe l'objet BlockingQueue à la classe de remplissage dans le constructeur de classe. Le problème que j'ai trouvé est que le BlockingQueue dans le bec est vide. Pourriez-vous s'il vous plaît laissez-moi savoir comment puis-je résoudre ce problème?

Répondre

1

Vous lancez une application tempête en exécutant une classe qui crée et configure la topologie en tant qu'ensemble d'objets, puis soumet cette collection d'objets (avec le fichier jar) au serveur Nimbus. Certains de ces objets sont des instances des becs et des boulons qui sont sérialisés dans le cadre de la soumission de la topologie. Chaque occurrence du boulon et du bec sur le cluster est l'un de ces objets désérialisés. Donc, tous les boulons et les becs sont construits lorsque vous démarrez la topologie (généralement sur un nœud de périphérie) et non sur le cluster. Ce que cela signifie pour vous, c'est que tous les objets référencés par le bec pendant l'initialisation de la classe et la construction de l'objet sont sérialisés avec l'instance de bec. Cela inclurait le BlockingQueue. Votre BlockingQueue est en cours de sérialisation et distribué au cluster et il semble qu'il ne survit pas au voyage. Ce que vous voulez faire est de laisser la variable de la file d'attente bloquante nulle dans le constructeur et à la place de définir la variable dans la méthode open(). Lorsque vous créez l'objet file d'attente réel, vous pouvez le stocker dans une variable statique publique quelque part afin qu'il soit disponible pour la méthode open() du bec.