Dear Community,
I've done quite a lot of testing and somehow remotely loading a cache entry
filter from client to server only works after a compute-call was made.
This appears somewhat strange - maybe someone can explain (/or reproduce the
behaviour? Full code at the end of this mail).
The setup: Ignite 2.14 with PeerAssemblyLoadingMode.CurrentAppDomain; .NET
5.0 with incremental assembly versioning; (Thick) .NET client running
queries against a .NET-embedded server.
Summary of the client code:
- Create a cache and put some users
- Run ScanQuery (1st time) -> Exception "No matching type found for object
[typeId=327128514, typeName=SalaryFilter]. This usually indicates that
assembly with specified type is not loaded on a node."
- Run (any) compute task
- Run ScanQuery (2nd time) -> Works
Same behaviour can be observed when restarting / recompiling in-between any
of the above stages, repeating stages multiple times, and so on.
Thank you for any input on this.
Jay
SERVER CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode =
PeerAssemblyLoadingMode.CurrentAppDomain;
var ignite = Ignition.Start(IgniteConfig);
ignite.GetCluster().SetActive(true);
Console.ReadLine();
}
}
CLIENT CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode =
PeerAssemblyLoadingMode.CurrentAppDomain;
IgniteConfig.ClientMode = true;
var ignite = Ignition.Start(IgniteConfig);
var cache = ignite.GetOrCreateCache<string,
IBinaryObject>("Name_User_Cache").WithKeepBinary<string, IBinaryObject>();
IBinaryObjectBuilder builder =
ignite.GetBinary().GetBuilder("User");
IBinaryObject user = builder.SetField<int>("Salary", 1001).Build();
cache.Put("First User", user);
user = builder.SetField<int>("Salary", 1000).Build();
cache.Put("Second User", user);
user = builder.SetField<int>("Salary", 1002).Build();
cache.Put("Third User", user);
Console.WriteLine("First search:");
RunScanQuery(cache);
Console.WriteLine("Broadcasting compute job");
ignite.GetCompute().Broadcast(new HelloAction());
Console.WriteLine("Second search:");
RunScanQuery(cache);
Console.ReadLine();
}
static void RunScanQuery(ICache<string, IBinaryObject> cache)
{
try
{
using (var cursor = cache.Query(new ScanQuery<string,
IBinaryObject>(new SalaryFilter())))
{
foreach (var entry in cursor)
{
Console.WriteLine("Key = " + entry.Key + ", Value.Salary
= " + entry.Value.GetField<int>("Salary").ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
}
class HelloAction : IComputeAction
{
public void Invoke()
{
Console.WriteLine("Hello, World!");
}
}
class SalaryFilter : ICacheEntryFilter<string, IBinaryObject>
{
public bool Invoke(ICacheEntry<string, IBinaryObject> entry)
{
return entry.Value.GetField<int>("Salary") > 1000;
}
}
appreciate the help