Spring服务的后台执行
我正在开发一个简单的SpringMVC应用程序,从流式API下载推文并在网页中显示。应用程序的用户可以提交一个Spring服务的后台执行,spring,spring-mvc,background,twitter4j,Spring,Spring Mvc,Background,Twitter4j,我正在开发一个简单的SpringMVC应用程序,从流式API下载推文并在网页中显示。应用程序的用户可以提交一个任务,其中包含他们想要下载的推文关键词。此任务是共享的,因此每个人都可以启动、停止、修改、更改或取消任务 TwitterFetcher是负责下载tweet的类。此类接收任务并将所有下载的tweet持久化到数据库中 @Service public class TwitterFetcher { @Autowired private OAuthService oAuthSer
任务
,其中包含他们想要下载的推文关键词。此任务是共享的,因此每个人都可以启动、停止、修改、更改或取消任务
TwitterFetcher
是负责下载tweet的类。此类接收任务并将所有下载的tweet持久化到数据库中
@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]
}
}
基本功能将是下一个:
我的问题是,抓取程序会阻止应用程序还是会在不同的线程中执行?在最坏的情况下,我必须改变什么来解决这个问题?我离一个可用的应用还很远,所以我无法测试它。即便如此,如果可能的话,我想现在就修复它。您可以使用ExecutorService在单独的线程中运行获取程序。我建议您使用ThreadPool,以便在有太多用户运行抓取程序时不会影响性能:
ExecutorService executor = Executors.newFixedThreadPool(maxThreads)
当通过executor提交任务时,它将返回一个Future
对象,您可以从中检查作业完成情况
Future f = executor.submit(myTask);
boolean isDone = f.isDone();
如果您不熟悉Java并发,请阅读更多有关Java并发的内容:用注释注释start()方法
这将使start方法异步,并且不会阻塞应用程序
您可以查看一个简单的示例
@Async
public void start(Task task)