首页 > 解决方案 > 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 的,它会如何工作?

标签: c#.netignite

解决方案


是的,ScanQuery需要在服务器端存在过滤器实现。

如果服务器是用 JAVA 编写的,而客户端是 .NET 的,它会如何工作

这是行不通的,因为 Ignite 需要在服务器端执行 .NET 过滤器,而纯 Java 的服务器节点不能这样做。


推荐阅读