Pivotal GemFire ​​9.3.0: XML-конфигурация Spring Data GemFire ​​в кластере GemFire

Я переношу свой кластер GemFire ​​с версии 8.2.7 (с Spring Data GemFire ​​1.6.0.RELEASE) на Pivotal GemFire ​​9.3.0 (SDG 2.0.7.RELEASE). Я использовал spring-context.xml (объявленный под тегом initializer в cache.xml) для инициализации регионов при запуске серверов кеширования на каждом узле.

Когда я пытаюсь повторно использовать тот же spring-context.xml для Pivotal GemFire ​​9.3.0, мой тег beans Spring не идентифицируется командой gfsh, и я получаю следующее исключение:

Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 107; cvc-elt.1: Cannot find the declaration of element 'beans'.

        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)

        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)

весна-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:gfe="http://www.springframework.org/schema/geode"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/geode http://www.springframework.org/schema/gemfire/spring-geode.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <util:properties id="gemfireProperties">
        <prop key="log-level">config</prop>
        <prop key="locators">hostA[10334],hostB[10334]</prop>
    </util:properties>

    <bean id="mappingPdxSerializer" class="org.springframework.data.gemfire.mapping.MappingPdxSerializer"/>

    <gfe:cache properties-ref="gemfireProperties" pdx-serializer-ref="mappingPdxSerializer"/>

    <gfe:replicated-region id="Product">
    </gfe:replicated-region>

    <gfe:replicated-region id="ProductCustomer">
    </gfe:replicated-region>

</beans>

Я обновил пути схемы XML с «gemfire» до «geode» на основе документации Spring для spring-data-gemfire:2.0.7.RELEASE.

Пробуем с GF 9.1.1 и SDGF 2.0.7. (SDGF jar находится в lib)

Сценарий:

#!/bin/sh
export PATH=$PATH:/var/tmp/user/gemfire/9.1.1:/opt/jdk/1.8.0_71l64/bin/:/var/tmp/user/gemfire/9.1.1/bin/
export GEMFIRE=/var/tmp/user/gemfire/9.1.1/


for i in `ls  /var/tmp/user/gemfire/9.1.1/lib/*.jar`
do
  CLASSPATH=${CLASSPATH}:${i}
done
CLASSPATH=$CLASSPATH:/var/tmp/user/gemfire/9.1.1/config
#echo $CLASSPATH

if [ -e "/var/tmp/user/gemfire/9.1.1/config/spring-context.xml" ]; then
   echo "File exists"
else
 echo "File does not exist"
fi


gfsh start server --name=server1 --server-port=40405 --classpath=$CLASSPATH --spring-xml-location=/var/tmp/user/gemfire/9.1.1/config/spring-context.xml  --locators=hostA[10334],hostB[10334] --mcast-port=0

ОБНОВЛЕНИЕ:

FileNotFoundException брошено:

Caused by: java.io.FileNotFoundException: class path resource [var/tmp/sn17180/gemfire/9.1.1/config/spring-context.xml] cannot be opened because it does not exist

        at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)

        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)

        ... 17 more

Я дал разрешение всем файлам, и -e "/" в моем скрипте также выводит "Файл существует".

ОБНОВИТЬ:

cache.xml

<?xml version="1.0" encoding="UTF-8"?>
<cache xmlns="http://geode.apache.org/schema/cache"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
       version="1.0">

  <region name="Parent" refid="REPLICATE">
    <region name="Child" refid="REPLICATE"/>
  </region>

</cache>

gemfire-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:gfe="http://www.springframework.org/schema/gemfire"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <util:properties id="gemfireProperties">
        <prop key="locators">xyz[10334],xyx[10334]</prop>
        <prop key="mcast-port">0</prop>
    </util:properties>

    <bean id="autoSerializer" class="org.apache.geode.pdx.ReflectionBasedAutoSerializer"/>

    <gfe:cache properties-ref="gemfireProperties" cache-xml-location="cache.xml" pdx-serializer-ref="autoSerializer" pdx-read-serialized="true"/>   

</beans>

person Sudharsan    schedule 29.05.2018    source источник


Ответы (1)


Pivotal GemFire ​​прекратил поставки с Spring Data GemFire ​​ в каталоге $GEMFIRE_HOME/lib, начиная с серии выпуска 9.x. Для этого есть две основные причины.

1) Во-первых, это было своего рода загадкой, что Pivotal GemFire ​​зависел от SDG, который был полностью для gfsh>start server --name=SpringConfiguredServer --spring-xml-location-/path/to/spring/context.xml, когда SDG зависел от Pivotal GemFire, что явно образует круговую зависимость.

2) Pivotal GemFire ​​значительно отстает от текущего состояния экосистемы Spring, когда дело касается версий. Даже последний выпуск, 9.3.0, поставляется с устаревшими JAR-файлами Spring, например ядро Spring Framework 4.3.13.RELEASE, когда ядро ​​Spring Framework 4.3.17.RELEASE уже доступно, а также 5.0.6.RELEASE, с выходом 5.1 на горизонте.

При этом все еще можно настроить и загрузить ваши серверы Pivotal GemFire ​​с помощью Spring при запуске из Gfsh, используя команду start server, параметр --spring-xml-location. Вам просто нужно загрузить соответствующая версия SDG на основе версии Pivotal GemFire, которую вы используете (например, (9.3.0)), и поместите SDG в путь к классам при запуске сервера.

ПРИМЕЧАНИЕ: в настоящее время SDG 2.1.0.M3 (SD Lovelace) является единственной версией, основанной на Pivotal GemFire ​​9.3 и новее; в настоящее время установлено значение 9.5.0.

ПРИМЕЧАНИЕ: также нет, я специально не помню, сталкивался ли я с какими-либо критическими изменениями API между постепенным обновлением SDG Lovelace с Pivotal GemFire ​​9.3, затем до 9.4 и, наконец, достижением 9.5. Если у вас возникли проблемы с spring-data-gemfire:2.1.0.M3, вы также можете использовать spring-data-gemfire:2.1.0.M2, который был на основе Pivotal GemFire ​​9.3 в то время.

Итак, следуя приведенному выше рецепту, вы должны сделать следующее ...

gfsh> start server --name=SpringConfiguredServer --classpath=/file/system/path/to/spring-data-gemfire22.1.0.M3.jar --spring-xml-location=/classpath/to/your/spring-context.xml

Это должно работать!

Кроме того, вам не нужно переключать схемы с «gemfire» на «geode». Когда вы используете Spring Data GemFire, используйте схему «spring-gemfire». Когда вы используете Spring Data Geode, используйте схему «spring-geode». Либо, наверное, сработает, но ...

Надеюсь это поможет!

-j

person John Blum    schedule 30.05.2018
comment
Спасибо за ответ, Джон. Сейчас пробую с Gemfire 9.1.1 и SDGF- 2.0.7. Я получаю, что файл не существует, исключение ввода-вывода. Пожалуйста, проверьте обновленный пост. - person Sudharsan; 30.05.2018
comment
Привет Сударсан - Итак, как вы можете видеть из Stack Trace, контекст Spring по умолчанию (экземпляр ClassPathXmlApplicationContext, когда используется Spring XML) ищет ваш spring-context.xml в CLASSPATH, который соответствует типу ApplicationContext . Вот почему вы видите o.s.core.io.ClassPathResource в трассировке стека. Я подозреваю, что ваш spring-context.xml исходит из файловой системы, следовательно ... var/tmp/sn17180/gemfire/9.1.1/config/spring-context.xml)? В этом случае вам нужно сообщить Spring об этом, добавив к пути к spring-context.xml префикс file:///. ... - person John Blum; 30.05.2018
comment
Это эффективно заменяет местоположение поиска ресурсов по умолчанию ApplicationContext types, отличное от default, которое, опять же, для ClassPathXmlApplicationContext - это поиск CLASSPATH для конфигурации XML. Если бы ApplicationContext был FileSystemXmlApplicationContext, то Spring искал бы конфигурацию XML в файловой системе. Однако, даже если ApplicationContext по умолчанию задает путь к ресурсу в зависимости от типа, вы можете переопределить его с помощью спецификатора ресурса, как описано в Таблице 10 - Строки ресурсов по этой ссылке ... - person John Blum; 30.05.2018
comment
Итак, я думаю, что в вашем случае URL-адрес spring-context.xml будет ... file:///var/tmp/sn17180/gemfire/9.1.1/config/spring-context.xml. Обратите внимание, что экземпляр ClassPathXmlApplicationContext по-прежнему будет использоваться, но спецификатор ресурса file:// указывает контексту искать в файловой системе вместо CLASSPATH (по умолчанию). Надеюсь это поможет. - person John Blum; 30.05.2018
comment
Большое спасибо, Джон, за все объяснения. Я понял, что это сработало. - person Sudharsan; 30.05.2018
comment
Джон. Надеюсь, у вас все хорошо. Могу ли я указать свойство spring-xml-location в gemfire.properties ?. Я могу найти свойство xml кеша из основных документов, но не для контекста. Пожалуйста помоги. - person Sudharsan; 23.04.2019
comment
Не spring-xml-location, но вы можете установить cache-xml-file (см. Здесь: gemfire. docs.pivotal.io/97/geode/reference/topics/). Конечно, выше вы используете пространство имен SDG GFE, поэтому вы также можете просто установить <gfe:cache cache-xml-location=".."/>. :) - person John Blum; 23.04.2019
comment
Джон. если кэш начальной загрузки конфигурации кластера через cache.xml, может ли одноранговый или клиентский экземпляр получить доступ к тому же кешу и регионам через SDGF? - person Sudharsan; 23.04.2019
comment
Кеш всегда является синглтоном. Таким образом, не имеет значения, создается ли кеш с помощью собственных API-интерфейсов GemFire, cache.xml или конфигурации Spring. Чтобы получить доступ к регионам, созданным cache.xml, посмотрите: docs.spring.io/spring-data/geode/docs/current/reference/html/. Это также работает, когда ваше приложение является участником однорангового кэша в кластере и вы включили службу настройки кластера в локаторе и на одноранговых узлах. - person John Blum; 23.04.2019
comment
хорошо спасибо. обновил сообщение с помощью cache.xml и gemfire-config.xml. Могу ли я ввести gemfire-config.xml в свойство gemfire cache-xml-location при запуске кеш-сервера ?. будет ли он загружать кеш и регионы с ожидаемым сериализатором PDX? - person Sudharsan; 23.04.2019
comment
Он не может найти ваш cache.xml (т.е. var / tmp / sn17180 / gemfire / 9.1.1 / config / spring-context.xml), потому что команда Gfsh start server, параметр --spring-xml-location сначала просматривает путь к классам. Если вы хотите найти конфигурацию Spring XML в файловой системе, вам необходимо использовать одну из схем доступа к ресурсам Spring (например, file:///var/tmp/sn17180/gemfire/9.1.1/config/spring-context.xml). См. Таблицу 10 в (docs.spring .io / spring / docs / current / spring-framework-reference /) для получения дополнительных сведений. - person John Blum; 23.04.2019
comment
Если мой кеш-сервер запускается через Java API (средство запуска сервера), какое свойство я должен использовать, чтобы передать свой spring-context.xml? - person Sudharsan; 23.04.2019
comment
Затем это будет spring-xml-location или это свойство на ServerLauncher (gemfire-97-javadocs.docs.pivotal.io/org/apache/geode/). - person John Blum; 23.04.2019