Apache Ignite Linq over Sql 无法解析 java 类

Posted

技术标签:

【中文标题】Apache Ignite Linq over Sql 无法解析 java 类【英文标题】:Apache Ignite Linq over Sql Failed to resolve java class 【发布时间】:2021-11-22 09:36:12 【问题描述】:

我正在对使用 sql api 创建的表执行 linq。

我创建了表格:

var cfg = new CacheClientConfiguration(
    "PUBLIC",
    new QueryEntity(typeof(object), typeof(object)))
    
        SqlSchema = "PUBLIC",
        CacheMode = CacheMode.Partitioned
    ;

var cache = cli.GetOrCreateCache<object, object>(cfg);
cache.Query(new SqlFieldsQuery(@"
    CREATE TABLE IF NOT EXISTS Things 
    (
        Id UUID,
        Name VARCHAR,
        EffectiveDate TIMESTAMP,

        PRIMARY KEY(Id)
    )
    WITH ""TEMPLATE = PARTITIONED,
           CACHE_NAME = consoleappserver.Thing,
           VALUE_TYPE = consoleappserver.Thing""
")).GetAll();

我放了一些种子数据:

cache.Query(new SqlFieldsQuery(@"
    INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
    Guid.NewGuid(), "Test Name 1", DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc))).GetAll();

cache.Query(new SqlFieldsQuery(@"
    INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
    Guid.NewGuid(), "Test Name 2", DateTime.SpecifyKind(DateTime.Today.AddDays(1), DateTimeKind.Utc))).GetAll();

cache.Query(new SqlFieldsQuery(@"
    INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
    Guid.NewGuid(), "Test Name 3", DateTime.SpecifyKind(DateTime.Today.AddDays(2), DateTimeKind.Utc))).GetAll();

这是我的 linq 查询:

var cache = cli.GetCache<Guid, Thing>("consoleappserver.Thing");
var things = cache.AsCacheQueryable();
var effectiveDate = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc);
things = things.Where(t => t.Value.EffectiveDate <= effectiveDate);

foreach (var kv in things)

    Console.WriteLine("Things #0 '1'", kv.Value.Id, kv.Value.Name);

这是我用于映射的 C# 类:

public class Thing

    [QuerySqlField(Name = "ID")]
    public Guid Id  get; set; 

    [QuerySqlField(Name = "NAME")]
    public string Name  get; set; 

    [QuerySqlField(Name = "EFFECTIVEDATE")]
    public DateTime EffectiveDate  get; set; 

这是我尝试迭代 things 时遇到的错误:

Apache.Ignite.Core.Client.IgniteClientException: '无法解析 .NET [platformId=1, typeId=298456301] 中的 Java 类'consoleappserver.Thing'。'

这是记录的完整错误:

[11:00:18,731][SEVERE][client-connector-#110][ClientListenerNioListener] 无法处理客户端请求 [req=o.a.i.i.processors.platform.client.binary.ClientBinaryTypeNameGetRequest@250d2f65] org.apache.ignite.IgniteException 类:无法在 .NET [platformId=1,typeId=298456301] 中解析 Java 类“consoleappserver.Thing”。 在 org.apache.ignite.internal.processors.platform.client.binary.ClientBinaryTypeNameGetRequest.process(ClientBinaryTypeNameGetRequest.java:57) 在 org.apache.ignite.internal.processors.platform.client.ClientRequestHandler.handle(ClientRequestHandler.java:93) 在 org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:202) 在 org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:58) 在 org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:278) 在 org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:108) 在 org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:135) 在 org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119) 在 org.apache.ignite.internal.util.worker.GridWorkerPool$1.run(GridWorkerPool.java:69) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834) 原因:java.lang.ClassNotFoundException:无法在 .NET [platformId=1,typeId=298456301] 中解析 Java 类“consoleappserver.Thing”。 在 org.apache.ignite.internal.MarshallerContextImpl.getClassName(MarshallerContextImpl.java:400) 在 org.apache.ignite.internal.MarshallerContextImpl.getClassName(MarshallerContextImpl.java:333) 在 org.apache.ignite.internal.processors.platform.client.binary.ClientBinaryTypeNameGetRequest.process(ClientBinaryTypeNameGetRequest.java:52) ... 11 更多

【问题讨论】:

您能否检查服务器节点日志并从那里附上完整的错误详细信息?日志应包含相同的异常消息“无法解析...”,但带有服务器端堆栈跟踪。 我已经添加了 如何将数据插入缓存?使用 SQL 还是来自 Java? 样本数据是用sql(api)插入的 感谢您提供更多详细信息,我可以重现它。您使用的是哪个 Ignite 版本? 【参考方案1】:

由于表是使用 SQL 定义的,所以 Ignite 不知道 Thing 类型。在查询之前使用以下调用来强制二进制类型注册:

cli.GetBinary().GetBinaryType(typeof(Thing));

Ignition.StartClient 之后,每个客户端实例可以执行一次此调用。

【讨论】:

为什么linq返回的数据没有设置主键字段? @herme0 键列被映射到缓存键,这将打印键:Console.WriteLine("Things #0 '1'", kv.Key, kv.Value.Name)

以上是关于Apache Ignite Linq over Sql 无法解析 java 类的主要内容,如果未能解决你的问题,请参考以下文章

Apache Ignite中大量相似性调用的有效组合

apache ignite系列:ignite调优

Apache Ignite 学习

apache ignite系列: 简介

Apache Spark + Ignite 集群瘦客户端

Apache Zeppelin 与 Ignite 集成时出现“无法启动 Ignite 节点”错误