Как реализовать «очистку распределенного кэша» в Ofbiz? - PullRequest
2 голосов
/ 01 февраля 2011

У нас работает несколько экземпляров Ofbiz / Opentaps. Все экземпляры общаются с одной и той же базой данных. Существует множество таблиц, которые редко обновляются, поэтому они кэшируются, и все экземпляры поддерживают свои отдельные копии кэша в качестве стандартного механизма кэширования Ofbiz. Но в редких случаях, когда мы обновляем какой-либо объект, используя один из множества экземпляров, все остальные экземпляры продолжают показывать грязные данные кэша. Так что требуется ручное действие, чтобы очистить все копии кэша и в других экземплярах.

Я хочу, чтобы эта операция очистки кэша во всех случаях происходила автоматически. На странице слияния Ofbiz здесь очень кратко упоминается "Очистка распределенного кэша". Он полагается на JMS, кажется, что всякий раз, когда очищается кэш экземпляра, он отправляет уведомление через JMS в тему, а другие экземпляры, подписывающиеся на ту же тему JMS, очищают свои соответствующие копии кэша после этого уведомления. Но я не мог найти какую-либо другую ссылку или документацию о том, как это сделать? Какие файлы нужно обновить, чтобы настроить все это в Ofbiz. Пример страницы / ссылки - это то, что я ищу.

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

Я добавил страницу на эту тему в вики OFBiz https://cwiki.apache.org/OFBIZ/distributed-entity-cache-clear-mechanism.html. Хотя это хорошо объяснено здесь, вики-страница OFBiz добавляет другую важную информацию.

Обратите внимание, что ошибка, о которой здесь сообщалось, былаисправлено с тех пор, но другой в настоящее время находится на рассмотрении, я должен исправить это в ближайшее время https://issues.apache.org/jira/browse/OFBIZ-4296

Жак

2 голосов
/ 02 июня 2011

Да, я иногда исправлял это поведение на 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 в своем сообщении, если у вас есть что-то новое, чтобы поделиться.

2 голосов
/ 21 февраля 2011

Хорошо, я верю, что все понял.Я использовал ActiveMQ в качестве своего JMS-брокера, чтобы настроить его, поэтому в Ofbiz приведены шаги, чтобы заставить его работать:

1.Скопируйте activemq-all.jar в папку framework / base / lib внутри вашего базового каталога Ofbiz.

2.Изменить файл базы / 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.Редактировать файловый сервис / 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.Редактировать Файловый фреймворк / 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, самостоятельно очищая позицию кэша безлюбая необходимость очистки кэша вручную.

Cheers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...