#c# #.net #ignite
#c# #.net #воспламенить
Вопрос:
Я пытаюсь использовать пример ScanQuery, приведенный в:https://dzone.com/articles/getting-started-with-apache-ignitenet-part-3-cache
Я создал сервер Ignite с классом 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: не удалось внедрить ресурс [метод=setIgniteInstance, цель=org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilterImpl@15b7b1c, rsrc=IgniteKernal [longJVMPauseDetector=LongJVMPauseDetector …
Но эта ошибка исчезнет, если я скопирую PersonFilter также в проект IgniteServer и добавлю его к типам BinaryConfiguration.
Так ли это должно работать? Я думал, что клиенты могут создавать свои собственные фильтры во время выполнения и запускать их на сервере. Разве это не правда? Как это будет работать, если сервер написан на JAVA, а клиент на .NET?
Ответ №1:
Да, ScanQuery
требуется, чтобы реализация фильтра присутствовала на стороне сервера.
Как это будет работать, если сервер написан на JAVA, а клиент на .NET
Это не сработало бы, поскольку Ignite необходимо выполнить.СЕТЕВОЙ фильтр на стороне сервера и серверный узел, работающий только на Java, не могут этого сделать.
Комментарии:
1. Спасибо, Павел, за ответ. Итак, по сути, мы говорим, что что-либо с фильтрами (например, ScanQuery или непрерывный запрос) не будет работать в среде со смешанной платформой? Кажется большим недостатком. Существует ли обходной путь для таких сценариев?
2. Короче говоря, возможно ли вообще иметь отфильтрованный запрос, который также прослушивает обновления с запущенным сервером Java Ignite и . Чистый толстый клиент? Также приветствуется любое обходное решение.
3. @Munni вы должны выполнить. СЕТЕВЫЕ серверы, это проблема для вас?
4. Да, Павел, это должна быть комбинация java и .net.
5. @Munni затем запустите . СЕТЕВЫЕ серверные узлы. Воспламенить. NET построен поверх Java, это надмножество.