2017-02-02 13 views
1

Я программирую большое приложение данных, в котором два потока работают одновременно. Thread A получает данные из сети и помещает их как JSONOBJECT в BlockingQueue. Ветвь B, штормовой носик, затем читает из BlockingQueue и обрабатывает их.Совместное использование BlockingQueue в штормовом носике

Я передаю объект BlockingQueue классу носика в конструкторе класса. Проблема, которую я обнаружил, заключается в том, что BlockingQueue в носике пуст. Не могли бы вы сообщить мне, как я могу решить эту проблему?

ответ

1

Вы запускаете приложение шторма, запустив класс, который строит и настраивает топологию как набор объектов, а затем отправляет эту коллекцию объектов (вместе с файлом jar) на сервер Nimbus. Некоторые из этих объектов являются экземплярами носиков и болтов, которые сериализуются как часть представления топологии. Каждый экземпляр болта и носика на кластере является одним из этих десериализованных объектов. Таким образом, все болты и носики создаются при первом запуске топологии (обычно на краевом узле), а не в кластере.

Это означает, что любые объекты, на которые ссылается носик во время инициализации и построения объекта, сериализуются вместе с экземпляром носика. Это будет включать BlockingQueue. Ваш BlockingQueue сериализуется и распространяется в кластер, и похоже, что он не переживает поездки.

Что вы хотите сделать, это оставить переменную очереди блокировки null в конструкторе и вместо этого установить переменную в методе open(). Когда вы создаете фактический объект очереди, вы можете хранить его в общедоступной статической переменной где-нибудь, чтобы он был доступен для метода open() носика.