스트리밍 API에서 트윗을 다운로드하고 웹 페이지에 표시 할 수있는 간단한 스프링 MVC 애플리케이션을 개발 중입니다. 응용 프로그램 사용자는 다운로드 할 트윗 키워드를 사용하여 Task
을 제출할 수 있습니다. 이 작업은 모든 사람이 작업을 시작, 중지, 수정, 변경 또는 취소 할 수 있도록 공유됩니다.스프링 서비스의 백그라운드 실행
TwitterFetcher
은 다운로드 트윗을 담당하는 클래스입니다. 이 클래스는 Task를 받고 데이터베이스에 다운로드 된 모든 트윗을 유지합니다.
@Service
public class TwitterFetcher {
@Autowired
private OAuthService oAuthService;
@Autowired
private TweetService tweetService;
private Task task;
private TwitterStream twitterStream;
public void start(Task task) {
/* Stop previous stream */
stop();
/* Get OAuth credentials */
OAuth oAuth = oAuthService.findOneEnabled();
if (oAuth == null) {
} else {
this.task = task;
Configuration oAuthConfiguration = getOAuthConfiguration(oAuth);
twitterStream = new TwitterStreamFactory(oAuthConfiguration).getInstance();
twitterStream.addListener(new TwitterListener());
String keywords = task.getBaseKeywords() + ", " + task.getExpandedKeywords();
FilterQuery filterQuery = new FilterQuery();
filterQuery.track(keywords.split(", "));
twitterStream.filter(filterQuery);
}
}
public void stop() {
if (twitterStream != null) {
twitterStream.shutdown();
}
}
private Configuration getOAuthConfiguration(OAuth oAuth) {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(false);
cb.setJSONStoreEnabled(true);
cb.setOAuthAccessToken(oAuth.getAccessToken());
cb.setOAuthAccessTokenSecret(oAuth.getAccessTokenSecret());
cb.setOAuthConsumerKey(oAuth.getConsumerKey());
cb.setOAuthConsumerSecret(oAuth.getConsumerSecret());
return cb.build();
}
private class TwitterListener implements StatusListener {
@Override
public void onStatus(Status status) {
/* Persist new tweet */
Tweet tweet = new Tweet();
tweet.setJson(DataObjectFactory.getRawJSON(status));
tweetService.save(tweet);
}
[Omitted code]
}
}
기본 기능은 다음 중 하나가 될 것입니다 :
- 사용자가 웹 사이트에서 가져 오기를 시작합니다.
- 가져 오기 도구가 새로운 트윗을 받고 DB에 저장됩니다.
- 사용자가 트윗을 멈추기 전까지 가져 오기가 계속됩니다.
응용 프로그램에는 fetcher 및 작업을 제어하는 대시 보드가 있으며 사용자는 fetcher가 다운로드되는 동안 사용자가 상호 작용할 수 있어야합니다.
제 질문은 가져 오기 프로그램이 응용 프로그램을 차단하겠습니까, 아니면 다른 스레드에서 실행될 수 있습니까? 최악의 경우, 이것을 해결하기 위해 무엇을 바꾸어야합니까? 나는 아직 쓸모없는 앱에서 멀어서 테스트 할 수 없다. 그렇다고하더라도 가능한 한 지금 바로 수정하고 싶습니다.