From d4cbe0e730c79f0bf591230650c7ad2a37b055ef Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 4 Oct 2018 09:31:57 -0400 Subject: [PATCH] feed controller: move feed result fetch to spring scheduler memoizeWithExpiration will block threads if one is waiting on a result, or crashes when getting the result --- .../http/service/feed/FeedController.java | 93 +++++++++---------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java b/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java index 88e30c8eab..900be21c2e 100644 --- a/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java +++ b/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java @@ -24,66 +24,30 @@ */ package net.runelite.http.service.feed; -import com.google.common.base.Suppliers; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; -import net.runelite.http.api.feed.FeedResult; +import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.feed.FeedItem; +import net.runelite.http.api.feed.FeedResult; import net.runelite.http.service.feed.blog.BlogService; import net.runelite.http.service.feed.osrsnews.OSRSNewsService; import net.runelite.http.service.feed.twitter.TwitterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/feed") +@Slf4j public class FeedController { - private static final Logger logger = LoggerFactory.getLogger(FeedController.class); + private final BlogService blogService; + private final TwitterService twitterService; + private final OSRSNewsService osrsNewsService; - private BlogService blogService; - private TwitterService twitterService; - private OSRSNewsService osrsNewsService; - - private final Supplier feed = Suppliers.memoizeWithExpiration(() -> - { - List items = new ArrayList<>(); - - try - { - items.addAll(blogService.getBlogPosts()); - } - catch (IOException e) - { - logger.warn(null, e); - } - - try - { - items.addAll(twitterService.getTweets()); - } - catch (IOException e) - { - logger.warn(null, e); - } - - try - { - items.addAll(osrsNewsService.getNews()); - } - catch (IOException e) - { - logger.warn(null, e); - } - - return new FeedResult(items); - }, 10, TimeUnit.MINUTES); + private FeedResult feedResult; @Autowired public FeedController(BlogService blogService, TwitterService twitterService, OSRSNewsService osrsNewsService) @@ -93,9 +57,44 @@ public class FeedController this.osrsNewsService = osrsNewsService; } - @RequestMapping - public FeedResult getFeed() throws IOException + @Scheduled(fixedDelay = 10 * 60 * 1000) + public void updateFeed() { - return feed.get(); + List items = new ArrayList<>(); + + try + { + items.addAll(blogService.getBlogPosts()); + } + catch (IOException e) + { + log.warn(null, e); + } + + try + { + items.addAll(twitterService.getTweets()); + } + catch (IOException e) + { + log.warn(null, e); + } + + try + { + items.addAll(osrsNewsService.getNews()); + } + catch (IOException e) + { + log.warn(null, e); + } + + feedResult = new FeedResult(items); + } + + @RequestMapping + public FeedResult getFeed() + { + return feedResult; } }