c# - Ignite.Net ScanQuery“注入资源失败”
问题描述
我正在尝试如下所示的 ScanQuery 示例:https ://dzone.com/articles/getting-started-with-apache-ignitenet-part-3-cache
我创建了一个带有 Person 类的 Ignite Server,如下所示:
class Program
{
static void Main(string[] args)
{
var cfg = new IgniteConfiguration
{
// Register custom class for Ignite serialization
BinaryConfiguration = new BinaryConfiguration(typeof(Person))
};
cfg.BinaryConfiguration.NameMapper = new BinaryBasicNameMapper() { IsSimpleName = true };
IIgnite ignite = Ignition.Start(cfg);
ICache<int, Person> cache = ignite.GetOrCreateCache<int, Person>("persons");
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Inserting " + i + "th Person");
cache.Put(i, new Person() { Name = "Person " + i, Age = (i + 1) * 10 });
}
Console.WriteLine("***** Ignite Server Started and Ready *****");
Console.ReadLine();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"Person [Name={Name}, Age={Age}]";
}
}
和一个胖客户端如下:
class Program
{
static void Main(string[] args)
{
var cfg = new IgniteConfiguration
{
// Register custom class for Ignite serialization
BinaryConfiguration = new BinaryConfiguration(typeof(Person), typeof(PersonFilter))
};
cfg.ClientMode = true;
cfg.BinaryConfiguration.NameMapper = new BinaryBasicNameMapper() { IsSimpleName = true };
IIgnite ignite = Ignition.Start(cfg);
ICache<int, Person> cache = ignite.GetOrCreateCache<int, Person>("persons");
//ScanQuery with Filter
var scanQuery = new ScanQuery<int, Person>(new PersonFilter());
IQueryCursor<ICacheEntry<int, Person>> queryCursor = cache.Query(scanQuery);
foreach (ICacheEntry<int, Person> cacheEntry in queryCursor)
Console.WriteLine(cacheEntry);
Console.ReadLine();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"Person [Name={Name}, Age={Age}]";
}
}
public class PersonFilter : ICacheEntryFilter<int, Person>
{
public bool Invoke(ICacheEntry<int, Person> entry)
{
return entry.Key % 2 == 0;
}
}
当我同时运行它们时,胖客户端会抛出错误:
JavaException: class org.apache.ignite.IgniteCheckedException: 注入资源失败 [method=setIgniteInstance, target=org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilterImpl@15b7b1c, rsrc=IgniteKernal [longJVMPauseDetector=LongJVMPauseDetector ...</ p>
但是,如果我也在 IgniteServer 项目中复制 PersonFilter 并将其添加到 BinaryConfiguration 类型,则此错误就会消失。
这是它应该如何工作的吗?我认为客户端可以在运行时创建自己的过滤器并在服务器上运行它们。这不是真的吗?如果服务器是用 JAVA 编写的,而客户端是 .NET 的,它会如何工作?
解决方案
是的,ScanQuery
需要在服务器端存在过滤器实现。
如果服务器是用 JAVA 编写的,而客户端是 .NET 的,它会如何工作
这是行不通的,因为 Ignite 需要在服务器端执行 .NET 过滤器,而纯 Java 的服务器节点不能这样做。
推荐阅读
- google-apps-script - 通过 Google Workspace (GW) 通过 Google Apps 脚本 (GAS) 进行 API 打印
- r - R:ggplot2 更改注释中文本框的边距(geom="label"...)
- deep-learning - 在 pytorch 中实现 DCGAN 时出错:内核大小不能大于实际输入大小
- javascript - 如何在赛普拉斯测试中更新全局变量?
- node.js - 数据库插入服务的干净架构
- azure - AKS 无法使用 letencryptcertificate 从私有注册表中提取 docker 映像
- c# - System.InvalidOperationException:无法安排重复作业
- tensorflow - 使用 colab 训练图像分类模型
- eclipse - 如何删除 Eclipse 用户快捷键?
- ios - 无法获取默认语言。CFBundleDevelopmentRegion 不起作用