当前位置: 首页 > 知识库问答 >
问题:

如何从Scala应用程序为igniteSet设置Ignite节点?

尤研
2023-03-14

我想使用独立的Ignite集群设置IgniteSet并在Scala应用程序中填充它。

Caused by: class org.apache.ignite.IgniteCheckedException: Failed to start SPI: TcpDiscoverySpi [addrRslvr=null, sockTimeout=5000, ackTimeout=5000, marsh=JdkMarshaller [clsFilter=org.apache.ignite.marshaller.MarshallerUtils$1@32f308c6], reconCnt=10, reconDelay=2000, maxAckTimeout=600000, soLinger=0, forceSrvMode=false, clientReconnectDisabled=false, internalLsnr=null, skipAddrsRandomization=false]
...
Caused by: class org.apache.ignite.spi.IgniteSpiException: Failed to deserialize object with given class loader: jdk.internal.loader.ClassLoaders$AppClassLoader@2c13da15

从Ignite cluster返回的错误是:

Caused by: java.io.InvalidClassException: javax.cache.configuration.MutableConfiguration; local class incompatible: stream classdesc serialVersionUID = 201405, local class serialVersionUID = 201306200821

javax.cache.configuration.mutableconfigurationjavax.cache.cache-api包的一部分,因此错误表示存在某种版本不匹配。但我明确检查了我的Ignite集群使用的是1.1.0版本--在我的ignite_home中有文件apache-ignite-2.9.1-bin/libs/cache-api-1.0.0.jar;并且我的应用程序使用相同的版本--在我显式设置的build.sbt中(也试图完全排除此包):

libraryDependencies ++= Seq(
  ...,
  "javax.cache" % "cache-api" % "1.0.0"
)

此外,我找不到使用此类serialVersionUIDjavax.cache.cache-api版本:1.0.0和1.1.0都有Public static final long serialVersionUID=201306200821L;

# fails
# port == TcpDiscoverySpi port from cluster configuration
val host = "localhost:45900..46000" # also tried with single port and 

val tcpDiscoverySpi: TcpDiscoverySpi = new TcpDiscoverySpi
val ipFinder: TcpDiscoveryVmIpFinder = new TcpDiscoveryVmIpFinder
ipFinder.setAddresses(util.Arrays.asList(host.split(","): _*))
tcpDiscoverySpi.setIpFinder(ipFinder)

val igniteConfiguration: IgniteConfiguration = new IgniteConfiguration
igniteConfiguration.setDiscoverySpi(tcpDiscoverySpi)
igniteConfiguration.setClientMode(false) # also tried with true

val ignite: Ignite = Ignition.start(igniteConfiguration) # error raised here

此外,上面的代码片段在Java Spring应用程序中也能正常工作,在Java Spring应用程序中,节点被引发以设置Spring数据缓存。

在Scala应用程序中起作用的是用于点燃集群(用于创建常规缓存)的连接器节点,但我无法使用它,因为无法使用IgniteClient实例设置IgniteSet:(

# works as expected
val host = "localhost"
val connector_port = "10800" # == ClientConnectorConfiguration port from cluster configuration

val cfg = new ClientConfiguration()
      .setAddresses(host + ":" + connector_port)

val ignite: IgniteClient = Ignition.startClient(cfg)

val cache = ignite.getOrCreateCache(...)

Ignite集群的操作:它是通过2.9.1版本的脚本bin/Ignite.sh在本地引发的,配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="45900"/>
                <property name="localPortRange" value="100"/>

                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">
                        <property name="path" value="/opt/storage/ignite"/>
                    </bean>
                </property>
            </bean>
        </property>


        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="47100"/>
            </bean>
        </property>


        <property name="clientConnectorConfiguration">
            <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
                <property name="port" value="10800"/>
                <property name="portRange" value="100"/>
            </bean>
        </property>


        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="maxSize" value="1073741824"/>
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>

                <property name="storagePath" value="/opt/storage/ignite"/>
                <property name="walSegmentSize" value="134217728"/>

            </bean>
        </property>

    </bean>

</beans>
    null

将很高兴得到任何帮助!

UPD:在这里发现了类似的问题-建议排除Geronimo JCache规范,该规范的mutableconfiguration序列号为201405L。我试图排除它,但仍然有同样的错误:

excludeDependencies ++= Seq(
  ExclusionRule("org.apache.geronimo.specs"),
  ExclusionRule("org.apache.geronimo")
)

共有1个答案

郝峰
2023-03-14

Apache Ignite需要JCache1.0并附带相应版本的JAR。

如果您的客户端应用程序中有一个不同于服务器节点的JAR,您可能会看到这个(de)序列化问题。您可以使用1.1或1.0,但它必须匹配。

 类似资料:
  • 问题内容: 如何为Android应用程序设置IntelliJ IDEA? 问题答案: 我花了整整一天的时间尝试将所有内容组合在一起,涉及数百个站点和教程,但是它们都跳过了琐碎的步骤。 因此,这里是完整的指南: 下载并安装 Java JDK (选择Java平台) 下载并安装 Android SDK (建议安装程序) android SD完成安装后,在 Android SDK Tools* 下打开 S

  • 如何设置电子应用程序的应用程序图标? 我正在尝试

  • 类似于如何在AndroidMarshmallow上以编程方式打开特定应用程序的权限屏幕?但对于扑镖来说。

  • 设置应用程序 Nest is built with features from both ES6 and ES7 (decorators, async / await). It means, that the easiest way to start adventure with it is to use Babel or TypeScript. In this tutorial I will u

  • 目前,我正面临一个技术决策,我个人无法找到解决方案。 我目前正在开发一个多租户数据库。 结构如下: 有一个核心数据库,用于保存特定租户的数据和关系 有多个租户数据库实例(通过核心数据库中的查询,可以确定我应该连接到哪个租户id) 每个租户都位于一个单独的数据库实例(位于单独的服务器上) 每个租户都有特定的数据,其他租户都不应访问这些数据 每个数据库最好是mySQL(但如果有更好的选择,我愿意接受建