Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring服务的后台执行_Spring_Spring Mvc_Background_Twitter4j - Fatal编程技术网

Spring服务的后台执行

Spring服务的后台执行,spring,spring-mvc,background,twitter4j,Spring,Spring Mvc,Background,Twitter4j,我正在开发一个简单的SpringMVC应用程序,从流式API下载推文并在网页中显示。应用程序的用户可以提交一个任务,其中包含他们想要下载的推文关键词。此任务是共享的,因此每个人都可以启动、停止、修改、更改或取消任务 TwitterFetcher是负责下载tweet的类。此类接收任务并将所有下载的tweet持久化到数据库中 @Service public class TwitterFetcher { @Autowired private OAuthService oAuthSer

我正在开发一个简单的SpringMVC应用程序,从流式API下载推文并在网页中显示。应用程序的用户可以提交一个
任务
,其中包含他们想要下载的推文关键词。此任务是共享的,因此每个人都可以启动、停止、修改、更改或取消任务

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]
    }
}
基本功能将是下一个:

  • 用户从网站启动抓取程序
  • fetcher接收到一条新的tweet,并将其保存在DB中
  • 获取程序一直接收推文,直到用户停止它
  • 应用程序有一个仪表板来控制抓取器和任务,用户必须能够在抓取器下载时与其交互


    我的问题是,抓取程序会阻止应用程序还是会在不同的线程中执行?在最坏的情况下,我必须改变什么来解决这个问题?我离一个可用的应用还很远,所以我无法测试它。即便如此,如果可能的话,我想现在就修复它。

    您可以使用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)