我正在编写一个大数据应用程序,其中两个线程同时运行。线程A从网络接收数据并将它们作为JSONOBJECT放入BlockingQueue中。线程B,一个风暴喷口,然后从BlockingQueue读取并处理它们。
我将BlockingQueue对象传递给类构造函数中的spout类。我发现的问题是喷口中的BlockingQueue是空的。能告诉我怎样才能解决这个问题?
答案 0 :(得分:1)
通过运行某个类来启动风暴应用程序,该类构建并将拓扑配置为一组对象,然后将该对象集合(以及jar文件)提交给Nimbus服务器。其中一些对象是喷口和螺栓的实例,它们作为拓扑提交的一部分被序列化。群集上的每个螺栓和喷口实例都是这些反序列化对象之一。因此,当您首次启动拓扑(通常在边缘节点上)而不是群集上时,将构建所有螺栓和喷口。
这对您来说意味着,在类初始化和对象构造期间,spout引用的任何对象都会与spout实例一起序列化。这将包括BlockingQueue。您的BlockingQueue正在被序列化并分发到集群,听起来它没有在旅途中幸存下来。
您要做的是在构造函数中保留阻塞队列变量null,而是在open()方法中设置变量。当您创建实际的队列对象时,您可以将其存储在某个公共静态变量中,以便它可用于spout的open()方法。