我们有多个Ofbiz / Opentaps实例正在运行。所有实例都与同一个数据库通信。有许多表很少更新,因此缓存并且所有实例都将其各自的缓存副本维护为标准的Ofbiz缓存机制。但在极少数情况下,当我们使用众多实例之一更新某个实体时,所有其他实例都会显示脏缓存数据。因此,它需要手动操作以清除其他实例上的所有缓存副本。
我希望所有实例上的缓存清除操作自动发生。在Ofbiz confluence page here上,简要提到了“分布式缓存清除”。它似乎依赖于JMS,只要实例的缓存被清除,它就会通过JMS向主题发送通知,订阅同一JMS主题的其他实例会在此通知时清除相应的缓存副本。但我找不到任何其他参考或文件如何做到这一点?有哪些文件需要更新才能在Ofbiz中进行全部设置。我正在寻找一个示例页面/链接。
答案 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&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通知我。