【发布时间】:2019-10-05 07:24:57
【问题描述】:
我们正在使用 URLTemplateLoader 加载托管在 Web 服务器上的模板。
我的模板引擎应用程序是多线程的。
但是,如果有多个请求进入,我们确实将模板缓存“打开”
HTTP 429 Too Many Requests 响应
我们如何事先缓存模板?
【问题讨论】:
标签: freemarker
我们正在使用 URLTemplateLoader 加载托管在 Web 服务器上的模板。
我的模板引擎应用程序是多线程的。
但是,如果有多个请求进入,我们确实将模板缓存“打开”
HTTP 429 Too Many Requests 响应
我们如何事先缓存模板?
【问题讨论】:
标签: freemarker
我想出的一种解决方法是让一个主模板具有#include 所有模板,并在缓存到期时使用调度程序执行主模板。此过程在点击 freemarker 模板中的#include 时下载缓存。
【讨论】:
Configuration.getTemplate 获取这些模板。我想这样更干净。
您可以在TemplateLoader 实现中实现限制,并将其设置为Configuration 中的模板加载器。它应该只委托给另一个 TemplateLoader,但要在其周围添加限制。
虽然,如果源服务器(现在提供 429)在真正只是被要求履行职责时更加宽容,这可能会更好。
【讨论】:
TemplateLoader? TemplateLoader 通常是单例。无论如何,在TemplateLoader 中,您可以使用在所有线程之间共享的Semaphore,并且只有在线程从Semaphore 获得许可后才进行HTTP 请求。因此,您的应用程序将阻塞而不是淹没远程 HTTP 服务器。