如何在Liferay 7.1上启用缓存复制。 DXP 1.0 GA?

时间:2019-08-05 12:54:43

标签: java liferay wildfly ehcache jgroups

我有下一个环境:

  1. 具有群集许可证的Liferay 7.1 DXP(与wildfly 16.0捆绑在一起)
  2. 此捆绑包在本地主机上的同一台计算机(2个节点)中运行,但端口不同
  3. 每个节点具有相同的数据库(PostgreSQL)
  4. 在机器上单独运行弹性搜索
  5. 文档和媒体的共享文件夹
  6. 在portal-setup-wizard.properties中,我添加了“ cluster.link.enabled = true”和“ ehcache.replicator.properties.com.liferay.portal.kernel.webserver.WebServerServletToken = replicatePuts = true”复制缓存 7,部署示例Portlet以测试缓存复制

我尝试了以下步骤来测试缓存复制:

  1. 运行第一个节点。
  2. 之后,运行第二个节点。
  3. 转到第一个节点的本地主机
  4. 转到第二个节点的本地主机
  5. 请参阅日志中的下一条消息:
  

[传入2,liferay频道控制,WS-5459-64327] [JGroupsReceiver:91]   接受的视图MergeView :: [WS-5459-18884 | 3](2)[WS-5459-18884,   WS-5459-64327],两个子组:[WS-5459-64327 | 1](2)[WS-5459-64327,   WS-5459-18884],[WS-5459-18884 | 2](1)[WS-5459-18884]

  1. 在第一个节点上的测试portlet中,通过调试模式,我通过MultiVMPoolUtil添加了缓存:

MultiVMPoolUtil.getPortalCache(“ com.liferay.portal.kernel.webserver.WebServerServletToken”)。put(“ 1”,“ 1”)

  1. 在第二个节点中,我尝试从此缓存中获取价值:

MultiVMPoolUtil.getPortalCache(“ com.liferay.portal.kernel.webserver.WebServerServletToken”)。getKeys()

但是在第二个节点上的此缓存中没有键“ 1”,但是如果我尝试使用相同的API .remove(“ 1”)进行删除,则在第一个节点上将删除该值。

问题是如何为放置操作配置缓存复制?

1 个答案:

答案 0 :(得分:0)

ClusterLink不能像这样工作,而是“使”缓存无效,而不是“复制”它们:

如果您在节点1上修改对象“ 1”,则节点2将收到有关“ 1”已更改的通知,并且-如果该对象已被缓存-则将其从其自身的缓存中删除。仅在随后需要“ 1”的情况下,才会检测到缓存丢失并从数据库(或其他持久性存储)中检索对象。

如果node2上没有人要该对象,则node2上不会检索任何内容。

此外,如果node1上的缓存溢出(缓存不是无限的,实际上,它的大小可能配置为0),您甚至无法假设您将能够永远从node1的缓存中检索此对象。

因此,您的观察是正确的:在一个节点中进行更改或删除会将具有给定键的对象从所有缓存中删除。这就是它的实现方式,它非常有用:无需缓存您可能永远无法在给定计算机上访问的内容。

我相信很久以前就听说过实际的缓存复制,例如可能是可配置的。但是我从未尝试过,因为它不是必需的,并且无效也不会带来很大的负担。

相关问题