Я пробую образец ScanQuery, указанный в: https://dzone.com/articles/getting-started-with-apache-ignitenet-part-3-cache
Я создал Ignite Server с классом Person, как показано ниже:
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: класс org.apache.ignite.IgniteCheckedException: не удалось внедрить ресурс ...
Но эта ошибка исчезнет, если я скопирую PersonFilter также в проект IgniteServer и добавлю его в типы BinaryConfiguration.
Так это должно работать? Я думал, что клиенты могут создавать свои собственные фильтры во время выполнения и запускать их на сервере. Разве это не правда? Как это будет работать, если сервер написан на JAVA, а клиент - на .NET?