在将 Dispatcher 与 AEM 结合使用时,必须配置两者之间的交互以确保高效的缓存管理。根据您的环境,配置还可以提高性能。

设置 AEM 用户帐户 setting-up-aem-user-accounts

默认的 admin 用户帐户用于对默认安装的复制代理进行身份验证。创建一个用于复制代理的专用用户帐户。

如需了解更多信息,请参阅 AEM 安全检查清单中的 配置复制和传输用户 部分。

从作者环境使 Dispatcher 缓存失效 invalidating-dispatcher-cache-from-the-authoring-environment

页面发布时,AEM 作者实例上的复制代理会向 Dispatcher 发送缓存失效请求。Dispatcher 在发布新内容时最终刷新缓存中的文件。

使用以下步骤在 AEM 作者实例上配置复制代理。该配置会在页面激活时使 Dispatcher 缓存无效:

在“传输”选项卡上,输入 URI 访问 Dispatcher。

如果您使用的是标准 Dispatcher Flush 代理,则可能需要更新主机名和端口;例如,https://< dispatcherHost >:< portApache >/dispatcher/invalidate.cache

注意: ​对于 Dispatcher Flush 代理,仅在您使用基于路径的虚拟主机条目来区分场时使用 URI 属性。您可以使用此字段来锁定要使其失效的场。例如,场 #1 的虚拟主机为 www.mysite.com/path1/* ,场 #2 的虚拟主机为 www.mysite.com/path2/* 。您可以使用 URL /path1/invalidate.cache 锁定第一个场,使用 /path2/invalidate.cache 锁定第二个场。有关更多信息,请参阅 在多个域中使用 Dispatcher

根据需要配置其他参数。

单击“确定”即可激活代理。

或者,您也可以从 AEM Touch UI 访问和配置 Dispatcher Flush 代理。

有关如何启用对虚名 URL 的访问的详细信息,请参阅 启用对虚名 URL 的访问

刷新 Dispatcher 缓存的代理无需具有用户名和密码,但如果已配置用户名和密码,则将通过基本身份验证发送它们。

此方法可能存在两个问题:

从发布实例使 Dispatcher 缓存失效 invalidating-dispatcher-cache-from-a-publishing-instance

在某些情况下,可以通过将缓存管理从创作环境转移到发布实例来提高性能。随后,发布环境(而不是 AEM 创作环境)会在收到发布的页面时向 Dispatcher 发送缓存失效请求。

此类情况包括:

在“传输”选项卡上,通过输入所需的 URI 访问 Dispatcher。
如果您使用标准 Dispatcher Flush 代理,请更新主机名和端口。例如, http://<dispatcherHost>:<portApache>/dispatcher/invalidate.cache

注意: ​对于 Dispatcher Flush 代理,仅在您使用基于路径的虚拟主机条目来区分场时使用 URI 属性。您可以使用此字段来锁定要使其失效的场。例如,场 #1 的虚拟主机为 www.mysite.com/path1/* ,场 #2 的虚拟主机为 www.mysite.com/path2/* 。您可以使用 URL /path1/invalidate.cache 锁定第一个场,使用 /path2/invalidate.cache 锁定第二个场。有关更多信息,请参阅 在多个域中使用 Dispatcher

根据需要配置其他参数。

登录到发布实例并验证刷新代理配置。此外,还要确保启用了它。

对每个受影响的发布实例重复此操作。

手动使 Dispatcher 缓存失效 manually-invalidating-the-dispatcher-cache

要在不激活页面的情况下使 Dispatcher 缓存失效(或进行刷新),您可以向 Dispatcher 发出 HTTP 请求。例如,您可以创建一个 AEM 应用程序,以便管理员或其他应用程序能够刷新缓存。

HTTP 请求促使 Dispatcher 从缓存中删除特定文件。(可选)Dispatcher 随后使用新副本刷新缓存。

删除缓存的文件 delete-cached-files

发出 HTTP 请求以促使 Dispatcher 从缓存中删除文件。Dispatcher 仅在收到对页面的客户端请求时才重新缓存文件。对于不太可能同时收到对同一页面的请求的网站,可通过此方式删除缓存的文件。

HTTP 请求具有以下形式:

POST /dispatcher/invalidate.cache HTTP/1.1
CQ-Action: Activate
CQ-Handle: path-pattern
Content-Length: 0
        

通过接触 .stat 文件使 Dispatcher 缓存中的所有其他文件(或向上至特定级别,取决于 /statfileslevel 设置)失效。将此文件的上次修改日期与缓存的文档的上次修改日期进行比较,如果 .stat 文件更新,则重新获取该文档。有关详细信息,请参阅按文件夹级别使文件失效

可以通过发送额外的标头 CQ-Action-Scope: ResourceOnly 防止失效(即接触 .stat 文件)。该功能可用于刷新特定资源。所有这些都不会使缓存的其他部分(如 JSON 数据)失效。 该数据是动态创建的,需要定期刷新,与缓存无关。例如,表示从第三方系统获取的数据以显示新闻和股票行情等等。

删除和重新缓存文件 delete-and-recache-files

发出 HTTP 请求,促使 Dispatcher 删除缓存的文件,并立即检索和重新缓存文件。在网站可能同时收到对同一页面的客户端请求时,删除并立即重新缓存文件。立即重新缓存可确保 Dispatcher 仅检索和缓存页面一次,而不是为每个并发客户端请求检索和缓存页面一次。

注意: ​应仅在发布实例上执行文件删除和重新缓存操作。在从创作实例执行时,在资源发布之前尝试重新缓存资源时会发生争用情况。

HTTP 请求具有以下形式:

POST /dispatcher/invalidate.cache HTTP/1.1
CQ-Action: Activate
`Content-Type: text/plain
CQ-Handle: path-pattern
Content-Length: numchars in bodypage_path0
page_path1
page_pathn
CQ-Action: Activate
Content-Type: text/plain
CQ-Handle: /content/geometrixx-outdoors/en/men.html
Content-Length: 36
/content/geometrixx-outdoors/en.html
        

刷新 Servlet 示例 example-flush-servlet

以下代码实施一个向 Dispatcher 发送失效请求的 servlet。此 servlet 接收包含 handlepage 参数的请求消息。这些参数分别提供要重新缓存的页面的 CQ-Handle 标头和路径的值。此 servlet 使用这些值为 Dispatcher 构造 HTTP 请求。

在将 servlet 部署到发布实例时,以下 URL 会促使 Dispatcher 删除 /content/geometrixx-outdoors/en.html 页面,然后缓存一个新副本。

10.36.79.223:4503/bin/flushcache/html?page=/content/geometrixx-outdoors/en.html&handle=/content/geometrixx-outdoors/en/men.html

此示例 servlet 不安全,并且仅演示对 HTTP Post 请求消息的使用。您的解决方案应保护对 servlet 的访问。
import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.apache.felix.scr.annotations.Property; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; @Component(metatype=true) @Service public class Flushcache extends SlingSafeMethodsServlet { @Property(value="/bin/flushcache") static final String SERVLET_PATH="sling.servlet.paths"; private Logger logger = LoggerFactory.getLogger(this.getClass()); public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { //retrieve the request parameters String handle = request.getParameter("handle"); String page = request.getParameter("page"); //hard-coding connection properties is a bad practice, but is done here to simplify the example String server = "localhost"; String uri = "/dispatcher/invalidate.cache"; HttpClient client = new HttpClient(); PostMethod post = new PostMethod("https://"+host+uri); post.setRequestHeader("CQ-Action", "Activate"); post.setRequestHeader("CQ-Handle",handle); StringRequestEntity body = new StringRequestEntity(page,null,null); post.setRequestEntity(body); post.setRequestHeader("Content-length", String.valueOf(body.getContentLength())); client.executeMethod(post); post.releaseConnection(); //log the results logger.info("result: " + post.getResponseBodyAsString()); }catch(Exception e){ logger.error("Flushcache servlet exception: " + e.getMessage());