【问题标题】:How to implement "Distributed cache clearing" in Ofbiz?如何在 Ofbiz 中实现“分布式缓存清除”?
【发布时间】:2011-02-01 17:25:23
【问题描述】:

我们有多个 Ofbiz/Opentaps 实例正在运行。所有实例都与同一个数据库通信。有许多表很少更新,因此它们被缓存,并且所有实例都将其各自的缓存副本作为标准的 Ofbiz 缓存机制。但是在极少数情况下,当我们使用多个实例之一更新某个实体时,所有其他实例都会继续显示脏缓存数据。因此,它需要手动操作来清除其他实例上的所有缓存副本。

我希望所有实例上的缓存清除操作自动发生。在 Ofbiz confluence page here 上,非常简短地提到了“分布式缓存清除”。它似乎依赖于 JMS,因此每当清除实例的缓存时,它都会通过 JMS 向主题发送通知,而订阅同一 JMS 主题的其他实例会根据此通知清除其相应的缓存副本。但是我找不到有关如何执行此操作的任何其他参考或文档?需要更新哪些文件才能在 Ofbiz 中进行设置?我正在寻找一个示例页面/链接。

【问题讨论】:

  • @Downvoters:在一个 2 岁以上的问题上,一分钟内 2 次反对票。请至少留下评论。

标签: caching jms distributed ofbiz


【解决方案1】:

我在 OFBiz wiki https://cwiki.apache.org/OFBIZ/distributed-entity-cache-clear-mechanism.html 中添加了一个关于此主题的页面。虽然这里解释得很好,但 OFBiz wiki 页面添加了其他重要信息。

请注意,这里报告的错误已经修复,但另一个目前正在等待处理,我应该尽快修复它https://issues.apache.org/jira/browse/OFBIZ-4296

雅克

【讨论】:

  • 太棒了,非常感谢你把它放在官方文档上。我必须在 Ofbiz JMS 服务引擎中进行更多更改以优雅地处理异常,更重要的是在 runAsync 方法中异步运行。早期的代码在 JMS 提供程序不可用的情况下回滚 Orders(我认为任何电子商务网站都严格禁止缓存清除操作)。
  • @Jacques:链接页面现在是 404。
  • 感谢 Amal,不知道为什么我没有从 stackoverflow 收到您的消息。这里是实际链接cwiki.apache.org/confluence/display/OFBIZ/…
【解决方案2】:

好吧,我相信我已经弄清楚了。我已经使用 ActiveMQ 作为我的 JMS 代理来设置它,所以这里是 Ofbiz 中使其工作的步骤:

1.将 activemq-all.jar 复制到您的 Ofbiz 基本目录中的 framework/base/lib 文件夹中。

2。编辑文件 base/config/jndiservers.xml:在 标签内添加以下定义:

   <jndi-server name="activemq"
     context-provider-url="failover:(tcp://jms.host1:61616,tcp://jms.host2:61616)?jms.useAsyncSend=true&amp;timeout=5000"
     initial-context-factory="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
     url-pkg-prefixes=""
     security-principal=""
     security-credentials=""/>

3.编辑文件base/config/jndi.properties:在最后添加这一行:

topic.ofbiz-cache=ofbiz-cache

4.编辑文件 service/config/serviceengine.xml:在 标签内添加如下定义:

    <jms-service name="serviceMessenger" send-mode="all">
       <server jndi-server-name="activemq"
       jndi-name="ConnectionFactory"
       topic-queue="ofbiz-cache"
       type="topic"
       listen="true"/>
    </jms-service>

5.编辑文件 entityengine.xml:更改默认委托人以启用分布式缓存:

<delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="true">

6.编辑文件framework/service/src/org/ofbiz/service/jms/AbstractJmsListener.java:这个可能是Ofbiz代码的bug

更改以下行:

this.dispatcher = GenericDispatcher.getLocalDispatcher("JMSDispatcher", null, null, this.getClass().getClassLoader(), serviceDispatcher);

收件人:

this.dispatcher = GenericDispatcher.getLocalDispatcher("entity-default", null, null, this.getClass().getClassLoader(), serviceDispatcher);

7.最后通过发出以下命令构建服务引擎代码:

ant -f framework/service/build.xml

有了这个实体,Ofbiz 中一个实例上的数据更改会立即传播到所有其他 Ofbiz 实例,自行清除缓存行项目,而无需手动清除缓存。

干杯。

【讨论】:

    【解决方案3】:

    是的,我以前有时在 http://svn.apache.org/viewvc?rev=1090961&view=rev 修复了此行为。但它仍然需要另一个与https://issues.apache.org/jira/browse/OFBIZ-4296 相关的修复。

    下面的补丁在本地修复了这个问题,但仍然在集群上创建了 2 个侦听器,不知道为什么...仍在调查(不是优先事项)...

    Index: framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
    ===================================================================
    --- framework/entity/src/org/ofbiz/entity/DelegatorFactory.java (revision 1879)
    +++ framework/entity/src/org/ofbiz/entity/DelegatorFactory.java (revision 2615)
    @@ -39,10 +39,10 @@
    
                 if (delegator != null) {
    +                // setup the distributed CacheClear
    +                delegator.initDistributedCacheClear();
    +
                     // setup the Entity ECA Handler
                     delegator.initEntityEcaHandler();
                     //Debug.logInfo("got delegator(" + delegatorName + ") from cache", module);
    -                
    -                // setup the distributed CacheClear
    -                delegator.initDistributedCacheClear();
    
    
    
                 return delegator;
    

    如果您有新内容要分享,请在您的帖子中使用@JacquesLeRoux 通知我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 2019-09-29
      • 2014-01-27
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2012-11-12
      相关资源
      最近更新 更多