2

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

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

4

3 回答 3

3

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

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

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

   <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:在 <service-engine> 标签内添加如下定义:

    <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 实例,自行清除缓存行项目,而无需手动清除缓存。

干杯。

于 2011-02-20T22:35:57.170 回答
3

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

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

雅克

于 2011-05-28T14:53:42.660 回答
2

是的,我有时在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 通知我。

于 2011-06-02T15:12:36.560 回答