2017-02-02 2 views
1

두 개의 스레드가 동시에 실행되는 큰 데이터 응용 프로그램을 프로그래밍하고 있습니다. 쓰레드 A는 네트워크로부터 데이터를 받아 BlockingQueue에 JSONOBJECT로 저장한다. storm spout 인 Thread B가 BlockingQueue에서 읽고 처리합니다.storm spout에서 BlockingQueue를 공유합니다.

클래스 생성자의 Spout 클래스에 BlockingQueue 객체를 전달합니다. 내가 찾은 문제는 스파우트의 BlockingQueue가 비어 있다는 것입니다. 이 문제를 어떻게 해결할 수 있는지 알려주십시오.

답변

1

토폴로지를 빌드하고 구성하는 클래스를 실행하여 폭풍 응용 프로그램을 시작한 다음 해당 개체 모음 (jar 파일과 함께)을 Nimbus 서버에 제출합니다. 이러한 객체 중 일부는 토폴로지 제출의 일부로 직렬화 된 스파우트 및 볼트의 인스턴스입니다. 클러스터에있는 볼트 및 스파우트의 각 인스턴스는 이러한 비 직렬화 된 객체 중 하나입니다. 따라서 모든 볼트와 스파우트는 클러스터가 아닌 토폴로지를 처음 시작할 때 (일반적으로 에지 노드에서) 구성됩니다.

클래스 초기화 및 객체 생성 중에 스파우트에 의해 참조되는 모든 객체가 spout 인스턴스와 함께 직렬화된다는 것을 의미합니다. 여기에는 BlockingQueue가 포함됩니다. BlockingQueue가 직렬화되어 클러스터에 배포되며 여행에서 살아남지 못하는 것 같습니다.

원하는 것은 차단 대기열 변수를 생성자에서 null로두고 대신 open() 메서드에서 변수를 설정하는 것입니다. 실제 큐 객체를 만들 때 spout의 open() 메소드에서 사용할 수 있도록 public static 변수에 저장할 수 있습니다.