Получение IgniteCheckedException: экземпляр Ignite по умолчанию уже запущен исключение при включении постоянства на одном узле - PullRequest
0 голосов
/ 20 мая 2019

Я развертываю приложение, в котором мне нужно хранить некоторые данные в кеше Ignite. Я использовал в памяти Ignite кеш. Вот конфигурация Ignite, которую я использовал:

<property name="cacheConfiguration">
        <list>
            <bean
                class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="name" value="IGNITE_DATA" />
                <property name="cacheMode" value="PARTITIONED" />
                <property name="atomicityMode" value="ATOMIC" />
                <property name="writeSync"
                    value="PRIMARY_SYNC" />
                <property name="backups"
                    value="${IGNITE_CACHE_BACKUPS}" />
            </bean>
        </list>
    </property>

Теперь, когда я развернул несколько экземпляров своего приложения и сохранил данные в кэше Ignite. Его разделяют между всеми экземплярами приложения. Даже если какой-либо экземпляр отключается и через какое-то время запускается, он получает самые последние данные через синхронизацию кэша Ignite.

Но проблема возникает, когда все экземпляры приложений выключаются. Когда они появляются, данные исчезают, поскольку они не сохраняются. Для сохранения я использовал свойство dataStorageConfiguration и включил сохранение. Вот изменение, которое я добавил в конфигурацию Ignite:

<property name="dataStorageConfiguration">
        <bean
            class="org.apache.ignite.configuration.DataStorageConfiguration">
            <!-- Enabling Apache Ignite Persistent Store. -->
            <property name="defaultDataRegionConfiguration">
                <bean
                    class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true" />

                </bean>
            </property>

            <!-- Changing Write Ahead Log Mode. -->
            <property name="storagePath" value="${IGNITE_BC_STORE_PATH}"/>
            <property name="walMode" value="LOG_ONLY" />
        </bean>
    </property>

Теперь, когда я разверну свое приложение и попробую запустить Ignite из кода Java, как указано ниже:

log.info("Initializing IGNITE...");
ignite = Ignition.start(getClass().getResource(CONF_FILE));

Я получаю исключение каждый раз, когда заявляю, что экземпляр по умолчанию уже запущен. Пробовал несколько вещей, но не работал. Даже если я удаляю CacheConfiguration из Ignite Configuration и просто сохраняю dataStorageConfiguration, я все равно получаю ту же ошибку. Ошибка:

Caused by: class org.apache.ignite.IgniteCheckedException: Default Ignite instance has already been started.
    at org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1141)
    at org.apache.ignite.internal.IgnitionEx.startConfigurations(IgnitionEx.java:1076)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:962)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:881)
    at org.apache.ignite.Ignition.start(Ignition.java:373)

Обычно эта ошибка возникает, когда мы пытаемся запустить несколько узлов Ignite под одной и той же JVM, но здесь я запускаю один узел на каждую JVM. Тогда тоже получаю ошибку. Пожалуйста, поправьте меня, если я ошибаюсь.

Любая помощь здесь будет оценена.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я решил проблему. Похоже, проблема была не в конфигурации Ignite, а в конфигурации Spring Framework.

Я создавал бин для класса Ignite, используя lazy-init = true. Я переключил это на eager-init, и это решило мою проблему. Не уверен, как именно это решило, но это сработало, по крайней мере, в моем случае.

0 голосов
/ 20 мая 2019

Скорее всего, у вас есть более одного компонента IgniteConfiguration в вашем конфигурационном файле.Если один компонент конфигурации расширяет другой, убедитесь, что родительский объект является абстрактным.

...