2013-06-05 5 views
0

스트리밍 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] 
    } 
} 

기본 기능은 다음 중 하나가 될 것입니다 :

  1. 사용자가 웹 사이트에서 가져 오기를 시작합니다.
  2. 가져 오기 도구가 새로운 트윗을 받고 DB에 저장됩니다.
  3. 사용자가 트윗을 멈추기 전까지 가져 오기가 계속됩니다.

응용 프로그램에는 fetcher 및 작업을 제어하는 ​​대시 보드가 있으며 사용자는 fetcher가 다운로드되는 동안 사용자가 상호 작용할 수 있어야합니다.

제 질문은 가져 오기 프로그램이 응용 프로그램을 차단하겠습니까, 아니면 다른 스레드에서 실행될 수 있습니까? 최악의 경우, 이것을 해결하기 위해 무엇을 바꾸어야합니까? 나는 아직 쓸모없는 앱에서 멀어서 테스트 할 수 없다. 그렇다고하더라도 가능한 한 지금 바로 수정하고 싶습니다.

답변

0

ExecutorService를 사용하여 별도의 스레드에서 페처를 실행할 수 있습니다.

ExecutorService executor = Executors.newFixedThreadPool(maxThreads) 

이 작업은 집행을 통해 제출하면 당신이 작업 완료를 확인할 수있는에서 Future 객체를 반환합니다 : 너무 많은 사용자가 가져 오기를 실행하면 성능을 타격하지 않도록 ThreadPool이를 사용하는 것이 좋습니다 것 당신이 익숙하지 않다면

Future f = executor.submit(myTask); 
boolean isDone = f.isDone(); 

자바 동시성에 대한 자세한 내용을 읽어 보시기 바랍니다 : http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

0

이 시작 @Async() 메서드를 주석.

@Async 
public void start(Task task) 

이렇게하면 시작 방법이 비동기로 만들어져 응용 프로그램이 차단되지 않습니다.

간단한 예제 here을 확인할 수 있습니다.

관련 문제