面对 java.nio.charset.MalformedInputException :输入长度 = 1 - 使用 Spring Data Cassandra 和 Amazon Keyspace,如何解决?

问题描述 投票:0回答:1

我在进行查询以从特定表中检索数据(大约 2000 行)时遇到问题(它适用于其他实体,我有 50 多个表);我收到 500 错误。令人困惑的是,有时它可以工作(对于完全相同的数据),但一旦失败,它就不会再次工作,直到我重新启动服务器。这是我遇到的错误:

2023-08-23T17:13:53.563+02:00 ERROR 63647 --- [nio-8091-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalArgumentException: java.nio.charset.MalformedInputException: Input length = 1] with root cause

java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274) ~[na:na]
    at java.base/java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:820) ~[na:na]
    at com.datastax.oss.driver.internal.core.type.codec.StringCodec.decode(StringCodec.java:110) ~[java-driver-core-4.17.0.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.StringCodec.decode(StringCodec.java:35) ~[java-driver-core-4.17.0.jar:na]
    at com.datastax.oss.driver.api.core.data.GettableByIndex.getObject(GettableByIndex.java:153) ~[java-driver-core-4.17.0.jar:na]


该异常似乎源自java.nio.charset.CoderResult.throwException。我正在使用 java-driver-core-4.17.0.jar 和 spring-data-cassandra-4.1.2.jar。

我尝试了不同的方法,但问题仍然间歇性地存在。一旦开始出现故障,让它再次工作的唯一方法就是重新启动服务器。 我已经寻找解决方案,但无法找到任何有助于诊断问题的相关信息。

我已基于此 Amazon Keyspaces 示例存储库

配置了 Cassandra

我的 keyspaces-application.conf:

datastax-java-driver {
    basic.contact-points = [ "<basic.contact-points>" ]
    advanced.reconnect-on-init = true

    # Amazon Keyspaces supports LOCAL_QUORUM for Inserts, Updates, and Deletes
    # Amazon Keyspaces supports ONE, LOCAL_ONE, and LOCAL_QUORUM for Selects
    basic.request.consistency = "LOCAL_QUORUM"
    basic.request.serial-consistency = "LOCAL_SERIAL"

    # set to true for retry policy to apply on writes
    basic.request.default-idempotence = true
    advanced.retry-policy {
        class = com.methodz.seo_jungle.config.AmazonKeyspacesRetryPolicy
        max-attempts = 6
    }

    basic.load-balancing-policy {
        local-datacenter = "<local-datacenter>"
        slow-replica-avoidance = false
    }

    #Use IAM ROLES and service roles
    # https://github.com/aws/aws-sigv4-auth-cassandra-java-driver-plugin
   # advanced.auth-provider = {
   #     class = software.aws.mcs.auth.SigV4AuthProvider
   #     aws-region = us-east-1
   # }
#
    #Use service specific credentials
    # https://docs.aws.amazon.com/keyspaces/latest/devguide/programmatic.credentials.ssc.html
    advanced.auth-provider{
        class = PlainTextAuthProvider
        username = "<username>"
        password = "<password>"
    }

    advanced.ssl-engine-factory {
        class = DefaultSslEngineFactory
        truststore-path = "<truststore-path>"
        truststore-password = "<truststore-password>"
        #hostname validation must be set to false
        hostname-validation = false
    }

    # For every connection, Amazon Keyspaces allows 3000 request per connection per endpoint
    # If pool.local.size = 3 * 3 endpoints = 9 total connections for session
    # For 9 connections at 3000 request per connection for a total of 27,000 rps
    advanced.connection.pool.local.size = 3

}

这是我在项目中使用的依赖项:

org.springframework.boot:spring-boot-starter:3.0.4
javax.servlet:javax.servlet-api:4.0.1
org.springframework.boot:spring-boot-starter-actuator:3.0.4
org.springframework.boot:spring-boot-starter-test:3.0.4
org.springframework.boot:spring-boot-starter-web:3.0.4
org.springframework.boot:spring-boot-starter-security:3.0.4
io.jsonwebtoken:jjwt-api:0.11.5
io.jsonwebtoken:jjwt-jackson:0.11.5
io.jsonwebtoken:jjwt-impl:0.11.5
com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2
org.springdoc:springdoc-openapi-starter-webmvc-api:2.1.0
org.springframework.boot:spring-boot-starter-aop:3.0.4
org.springframework.data:spring-data-elasticsearch:5.0.0
javax.xml.bind:jaxb-api:2.4.0-b180830.0359
org.springframework.data:spring-data-cassandra:4.1.2
com.datastax.oss:java-driver-core:4.17.0
org.springframework.boot:spring-boot-starter-data-cassandra:3.0.4
software.aws.mcs:aws-sigv4-auth-cassandra-java-driver-plugin:4.0.6
org.jetbrains.kotlin:kotlin-reflect:1.8.20-RC
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC
org.springframework.boot:spring-boot-devtools:3.0.4
org.springframework.boot:spring-boot-starter-logging:3.0.4
org.springframework:spring-context-support:6.0.6
org.springframework.boot:spring-boot-starter-mail:3.0.4
org.jetbrains.kotlinx:kotlinx-coroutines-core:pom:1.7.1
com.google.code.gson:gson:2.10.1
com.google.cloud:libraries-bom:pom:26.11.0
org.junit.jupiter:junit-jupiter-engine:5.9.2
javax.persistence:javax.persistence-api:2.2
org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.1
org.springframework.boot:spring-boot-starter-validation:3.1.2
org.hibernate.validator:hibernate-validator:8.0.1.Final
org.jsoup:jsoup:1.15.3
us.codecraft:xsoup:0.3.7
com.squareup.okhttp3:okhttp:4.9.1

导致此问题的模型可以在下面的代码片段中看到:

package com.methodz.seo_jungle.dao.organization

import org.springframework.data.annotation.Id
import org.springframework.data.cassandra.core.cql.PrimaryKeyType
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn
import org.springframework.data.cassandra.core.mapping.Table
import java.util.*

@Table("organization")
data class Organization(
    @Id
    @PrimaryKeyColumn("id", type = PrimaryKeyType.PARTITIONED)
    var id: UUID = UUID.randomUUID(),
    var name: String,
    var type: String = OrganizationType.COMPANY.name, //OrganizationType = OrganizationType.COMPANY
    var siret: String = "",
    var tva: String = "",
    var email: String = "",
    var address: String = "",
    var additionalAddressDetails: String = "",
    var city: String = "",
    var zipCode: String = "",
    var country: String = "",
    var legalRepresentativeFirstname: String = "",
    var legalRepresentativeLastname: String = "",
    var legalRepresentativeCountry: String = "",
    var legalRepresentativeBirthdate: Long = 0,
    var legalRepresentativeNationality: String = "",
    var currentCreditAmount: Double = 0.0,
    var totalCreditSpend: Double = 0.0,
    var totalCreditEarned: Double = 0.0,
    var status: String = OrganizationStatus.DRAFT.name
    var created: Long = DateUtils.getTimestamp(),
    var updated: Long = 0,
    var deleted: Long = 0
)

And here the schema of the associated table (auto generated)

使用的存储库是一个没有覆盖的简单存储库

@Repository
interface SupportRepository : CassandraRepository<Support, UUID> {}

我尝试使用 Amazon Corretto JDK 11 来匹配示例存储库,但仍然面临相同的问题(我正在使用 openJDK 20)

我不知道下一步该尝试什么

该错误似乎与 DataStax Java 驱动程序中的字符串编解码器有关。它的发生不一致,重新启动服务器可以暂时修复它。我已经寻找解决方案,但无法找到任何有助于诊断问题的相关信息。

任何帮助或见解将不胜感激!

spring kotlin spring-data spring-data-cassandra amazon-keyspaces
1个回答
0
投票

经过一番调查,我发现问题出在 Spring Data Cassandra 使用的准备好的查询上。不知何故,禁用它们解决了问题,但我不知道如何正确解决它。

    @Bean
    open fun cassandraTemplate(sessionFactory: SessionFactory?, converter: CassandraConverter?): CassandraOperations {
        val template = CassandraTemplate(sessionFactory!!, converter!!)
        template.isUsePreparedStatements=false
        return template
    }
© www.soinside.com 2019 - 2024. All rights reserved.