gpt4 book ai didi

java - Spring REST 缓存 RSS AbstractRssFeedView

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:25 28 4
gpt4 key购买 nike

我正在开发一个基于 REST 的 Web 服务,使用 Spring 来提供 RSS 提要。 RSS 的更新非常罕见(每周几次),因此我想缓存 RSS 提要,而不是每次有人请求时都构建它。这是我的代码。启动网络服务器后,我的第一个请求点击 SubscriptionEventHandler 类中的 getRssFeed() 方法,然后进入 SubscriptionRssFeedView 并调用 buildFeedMetadata、buildFeedItems 方法等,这是正确的。但是当我发出第二个请求时,它会跳过 SubscriptionEventHandler 中的 getRssFeed() 方法,但会调用 SubscriptionRssFeedView 中的 buildFeedMetadata、buildFeedItems 方法,进而调用 getIncidents() 并从头开始再次构建 RSS。有没有办法可以避免这种情况并缓存 RSS,直到我调用 @CacheEvict

这是我的SubscriptionRssFeedView

@Component("subscriptionRssView")
public class SubscriptionRssFeedView extends AbstractRssFeedView
{

private String base_Url=”http://mycompany.com/”;

private final String feed_title = "My RSS Title ";
private final String feed_desc = "RSS feed desc";
private final String feed_type = "rss_2.0";

@Override
protected void buildFeedMetadata(Map<String, Object> model, Channel feed, HttpServletRequest request)
{

feed.setTitle(feed_title);
feed.setDescription(feed_desc);
feed.setLink(base_Url);
feed.setFeedType(feed_type);

super.buildFeedMetadata(model, feed, request);
}


@Override
protected List<Item> buildFeedItems(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
List<Message> messageList = new ArrayList(Arrays.asList(getIncidents()));

List<Item> itemList = new ArrayList<Item>(messageList.size());

for (Message message : messageList)
{
itemList.add(createItem(message));
}

return itemList;
}


private Message[] getIncidents()
{
RestTemplate restTemplate = new RestTemplate();
Message[] message = restTemplate.getForObject("http://xxxxx.com/api/message", Message[].class);

return message;
}


private Item createItem(Message message)
{
Item item = new Item();
item.setLink(getFeedItemURL(message));
item.setTitle(prepareFeedItemTitle(message));
item.setDescription(createDescription(message));
item.setPubDate(getLocalizedDateTimeasDate(message.getT()));
return item;
}
}

我的SubscriptionEventHandler

@Component("SubscriptionService")
public class SubscriptionEventHandler implements SubscriptionService
{

@Autowired
private SubscriptionRssFeedView subscriptionRssFeedView;


@Override
@Cacheable("rssFeedCache")
public SubscriptionRssFeedView getRssFeed()
{
return subscriptionRssFeedView;
}

}

我的订阅服务

@Service
public interface SubscriptionService
{
SubscriptionRssFeedView getRssFeed();
}

我的订阅 Controller

@Controller
@RequestMapping("/subscription")
public class SubscriptionController
{

@Autowired
private SubscriptionService subscriptionService;


@RequestMapping(value = "/rss", method = RequestMethod.GET)
public SubscriptionRssFeedView getRSS() throws Exception
{
return subscriptionService.getRssFeed();
}
}

最佳答案

渲染 SubscriptionController 的响应时,将始终调用 SubscriptionRssFeedView 的 render 方法。该方法触发对 buildFeedMetadata、buildFeedEntries 等的调用。顺序如下:

AbstractView.render => AbstractFeedView.renderMergedOutputModel => SubscriptionRssFeedView.buildFeedMetadata 和 SubscriptionRssFeedView.buildFeedEntries

如果您想更详细地了解是什么触发了对这些方法的调用,您可以检查父类方法 AbstractView.render 和 AbstractFeedView.renderMergedOutputModel

如果您想避免重新计算 RSS,可以缓存 SubscriptionRssFeedView.getIncidents() 方法,而不是 SubscriptionEventHandler.getRssFeed()

我建议在缓存中添加一个键,否则所有对 getIncidents 的调用将始终返回相同的值,当您有多个 Fe​​ed 时,这将是不受欢迎的。

关于java - Spring REST 缓存 RSS AbstractRssFeedView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42403763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com