Apache Ignite 2.0 Java 和 .NET:BasicBinaryIdMapper 不再有效?

Apache Ignite 2.0 Java and .NET: BasicBinaryIdMapper no longer works?

我的目标是 运行 一个 Java Ignite 节点与一个 .NET 客户端连接到它。由于我遇到了一些问题,所以我使用了一个更简单的示例,不是 server/client 模型而是 server/server 模型。在 Ignite 2.0 之前,您可以像这样在 Java 端设置 BinaryConfiguration:

// Configure Ignite to connect with .NET nodes
BinaryConfiguration binCfg = new BinaryConfiguration();

binCfg.setIdMapper(new BinaryBasicIdMapper());
binCfg.setNameMapper(new BinaryBasicNameMapper());

这适用于此处显示的示例项目:https://ptupitsyn.github.io/Ignite-Multi-Platform-Cluster/

但是,如果您将这两个工作项目从 Ignite 1.7.0 升级到 Ignite 2.0.0,您现在将得到以下异常(这是来自 Java 方面):

原因:class org.apache.ignite.spi.IgniteSpiException:本地节点的二进制配置不等于远程节点的二进制配置[locNodeId=2d98d083-859f-4bae-bb9a-16fe00f9f39a, rmtNodeId=d9f68030-79b1- 4e41-bd00-1bec44dca9e3,locBinaryCfg={globIdMapper=org.apache.ignite.binary.BinaryBasicIdMapper,compactFooter=true,globSerializer=null},rmtBinaryCfg={globIdMapper=null, compactFooter=true, globSerializer=null}]

您会注意到在上述异常中 Java 节点具有 BinaryBasicIdMapper 设置,但是远程 .NET 节点不再具有此映射器,这导致了此异常。

我已尝试以下方法无济于事:

我一直在搜索 Ignite 文档,试图找出在 Ignite 2.0 中做什么,但我找不到任何关于做什么的例子。还有其他人遇到过这个问题吗?你是怎么解决的?

在 Ignite 2.0+ 中加入 Java 和 .NET 节点并将类型相互映射:

  • 两边使用 BinaryBasicNameMapperSimpleName
  • 不设置IdMapper
  • ignite.binary().type(Foo.class) (Java) 和 ignite.GetBinary().GetBinaryType(typeof(Foo)) (.NET)
  • 两边注册类型

详情:

Ignite.NET 2.0+ 使用与 Java 之前相同的动态类型注册。在启动节点之前无需在 BinaryConfiguration 中注册类型。通常,您根本不需要为注册类型而烦恼(就像我们对 GetBinaryType 调用所做的那样)——类型会在第一次使用时自动注册。但是,当涉及多个平台时,您会得到这个 "unknown pair" 异常,因为每个平台都将类型注册在一个单独的数据结构中。为什么?因为在反序列化时 Ignite 需要实例化一个实际的 class。在 .NET 中,此 class 可能是 Foo.Bar.Message,在 Java 中可能是 org.foo.bar.Message。因此,即使这两个 classes 映射到相同的 Ignite 二进制类型(简单名称映射器丢弃 namespace/package),在反序列化时我们需要知道完全限定名称。

我更新了 blog post in question and added working example to ignite-2.0 branch