好吧,我相信我已经弄清楚了。我使用 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&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 实例,自行清除缓存行项目,而无需手动清除缓存。
干杯。