如何在Ofbiz中实现“分布式缓存清除”?

时间:2011-02-01 17:25:23

标签: caching jms distributed ofbiz

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

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

3 个答案:

答案 0 :(得分:3)

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

请注意,此处报告的错误已修复,但另一个目前正在审核中,我应尽快修复https://issues.apache.org/jira/browse/OFBIZ-4296

雅克

答案 1 :(得分:2)

好吧我相信我已经全力以赴了。我已经使用ActiveMQ作为我的JMS代理进行设置,所以这里是Ofbiz中使其工作的步骤:

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

<强> 2。编辑文件base / config / jndiservers.xml:在&lt; jndi-config&gt;中添加以下定义标签:

   <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:在&lt; service-engine&gt;内添加以下定义标签:

    <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。编辑文件框架/ service / src / org / ofbiz / service / jms / AbstractJmsListener.java:这个可能是Ofbiz代码中的一个错误

更改以下行:

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

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

<强> 7。最后通过发出以下命令来构建serviceengine代码:

ant -f framework/service/build.xml

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

干杯。

答案 2 :(得分: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通知我。