Ignite.Net ScanQuery "Не удалось ввести ресурс" - PullRequest
0 голосов
/ 07 марта 2019

Я пробую образец 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?

1 Ответ

0 голосов
/ 07 марта 2019

Да, ScanQuery требует, чтобы реализация фильтра присутствовала на стороне сервера.

Как это будет работать, если сервер написан на JAVA, а клиент - на .NET

Это не сработает, поскольку Ignite необходимо выполнить фильтр .NET на стороне сервера, а серверный узел только для Java не может этого сделать.

...