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 节点不再具有此映射器,这导致了此异常。
我已尝试以下方法无济于事:
- 删除 BinaryBasicIdMapper(可以连接到集群,但不能反序列化对象,出现 "Unknown Pair" 异常)。
- 使用 true 参数创建 BinaryBasicNameMapper(以启用简单名称)。与上述相同的 "Unknown Pair" 异常。
我一直在搜索 Ignite 文档,试图找出在 Ignite 2.0 中做什么,但我找不到任何关于做什么的例子。还有其他人遇到过这个问题吗?你是怎么解决的?
在 Ignite 2.0+ 中加入 Java 和 .NET 节点并将类型相互映射:
- 两边使用
BinaryBasicNameMapper
和 SimpleName
- 不设置
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
我的目标是 运行 一个 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 节点不再具有此映射器,这导致了此异常。
我已尝试以下方法无济于事:
- 删除 BinaryBasicIdMapper(可以连接到集群,但不能反序列化对象,出现 "Unknown Pair" 异常)。
- 使用 true 参数创建 BinaryBasicNameMapper(以启用简单名称)。与上述相同的 "Unknown Pair" 异常。
我一直在搜索 Ignite 文档,试图找出在 Ignite 2.0 中做什么,但我找不到任何关于做什么的例子。还有其他人遇到过这个问题吗?你是怎么解决的?
在 Ignite 2.0+ 中加入 Java 和 .NET 节点并将类型相互映射:
- 两边使用
BinaryBasicNameMapper
和SimpleName
- 不设置
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