2017-09-11 4 views
0

나는 모든 트위터 계정에 대해 5000 명의 팔로어를 가져올 수 있도록 스프링 부트 HTTP 메소드를 구현했습니다. 백엔드에서 Twitter4j - AsyncTwitter : TwitterListener의 응답을 시작 요청과 연결

, 먼저, I는 그때 100

의 청크 5000 개 ID를 분할하고, 그 후

IDs ids = twitter.getFollowersIDs(username, -1); 

으로 5000 종동 ID를 검색하고, 그러고 AsyncTwitter 사용하고 트위터에 여러 개의 "lookupUsers"HTTP 요청을 비동기 적으로 보내고 LOCK.wait(); 다음 리스너 방법 다음

:

@Override 
    public void lookedupUsers(ResponseList<User> users) 

나는 각 응답을 읽고 클래스 속성 "followerAccounts"에 반환 된 사용자 목록을 추가 할 수 있습니다.

결국 모든 응답이 반환되면 LOCK.notify()를 사용하여 주 스레드의 차단을 해제하고 HTTP 메서드의 응답으로 "followerAccounts"를 반환합니다.

두 명의 외부 사용자가 동일한 스프링 HTTP 메서드를 동시에 호출하면 문제가되는 두 가지 HTTP 요청 중 "looksupUsers"메서드 내에서 TwitterListener를 체크 인 할 수 없습니다.

예를 들어 lookupUsers (ResponseList 사용자) 메소드 내의 Twitter HTTP 응답의 일부 헤더 또는 응답에 링크 된 "lookupUsers"요청을 어떻게 든 가리키는 매개 변수를 전달하는 방법은 무엇입니까?

많은 수의 병렬 요청을 지원하기 위해 확장되지 않기 때문에 HTTP 메서드를 동기화하고 싶지 않습니다.

+0

"메인 스레드"라고하는 것은 실제로 HTTP 요청으로 시작된 스레드입니다 ... 다른 요청과 어떻게 섞일 수 있는지 보지 못합니다. 어쩌면 내가하지 않았을 수도 있습니다. 너를 올바르게 이해한다. 어쨌든 스레드를 일시 중지하는 것은 나에게 좋지 않습니다. – Fernando

답변

2

트위터 비동기 API는 사용자의 요구를 쉽게 충족 할만큼 유연하지 않습니다. 모든 메소드는 아무것도 반환하지 않으므로 (void) 특정 http 요청에 대한 응답 (Futures)을 수집 할 수 없습니다. 사실, 각 메소드에 대한 세분화 된 콜백 대신 모든 API 메소드에 대한 글로벌 리스너 만 제공합니다. 그렇지 않으면 각 http 요청에 대해 별도의 콜백 인스턴스를 제공 할 수 있습니다.

글로벌 리스너 만 사용하여 각 HTTP 요청에 대한 응답을 분리 할 수는 있지만 매우 복잡한 논리로 스레드 안전 상태가 많이 필요하므로 효과적이지 않을 것이라고 생각합니다. 대신 나는이 비동기 api를 전혀 사용하지 말고 sync API 상단에 자신의 구현을 제공 할 것을 제안합니다. 각 ID 덩어리에 대해 별도의 작업을 만들어 스레드 풀에 제출하고 미래를 목록에 저장합니다. 그들을 반복하고 모든 결과를 수집하십시오. 이것은 모든 API 메소드에 대해 하나의 고정 스레드 풀 (기본적으로 오직 하나의 스레드)을 제공하는 기존 구현 (AsyncTwitterImplDispatcherImpl)보다 동시성 수준, 예외 처리 및 특정 twitter API 메소드에 대한 시간 초과에 대한 제어 기능을 제공합니다. 타임 아웃을 제공하지 않습니다.