获取IgniteCheckedException:在单个节点上启用持久性时,默认的Ignite实例已启动异常

时间:2019-05-20 14:06:42

标签: java spring ignite high-availability

我正在部署一个应用程序,该应用程序需要在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>

现在,当我部署应用程序并尝试从Java代码启动Ignite时,如下所述:

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

每次声明默认实例已经启动时都会遇到异常,尝试了几件事但没有用。即使我从Ignite Configuration中删除CacheConfiguration并仅保留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)

通常,当我们尝试在同一JVM下运行多个Ignite节点时,就会出现此错误,但是在这里,我每个JVM运行一个节点。然后也得到错误。 如果我错了,请纠正我。

这里的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

很可能您的配置文件中有多个class A: def __init__(self, name, color=None): self.name = name self._color = color @property def color(self): return self._color @color.setter def color(self, value): # some logic you may need before setting color to value self._color = value object1 = A('car') if not object1.color: # or if object1.color is None: object1.color = 'blue' bean。如果一个配置bean扩展了另一个配置bean,那么请确保其父对象是抽象的。

答案 1 :(得分:0)

我已经解决了问题。似乎问题不是Ignite配置,而是Spring Framework配置。

我正在使用lazy-init = true为Ignite类创建bean。我将其切换为eager-init并解决了我的问题。 不确定如何解决这个问题,但至少在我看来有效。