ApacheIgnite2.0Java和.NET:BasicBinaryIdMapper不再工作了?
我的目标是运行一个Java Ignite节点,并让一个.NET客户端连接到该节点。因为我遇到了一些问题,所以我选择了一个更简单的示例,不是服务器/客户机模型,而是服务器/服务器模型。在Ignite 2.0之前,您可以在Java端设置二进制配置,如下所示:ApacheIgnite2.0Java和.NET:BasicBinaryIdMapper不再工作了?,java,c#,caching,ignite,Java,C#,Caching,Ignite,我的目标是运行一个Java Ignite节点,并让一个.NET客户端连接到该节点。因为我遇到了一些问题,所以我选择了一个更简单的示例,不是服务器/客户机模型,而是服务器/服务器模型。在Ignite 2.0之前,您可以在Java端设置二进制配置,如下所示: // Configure Ignite to connect with .NET nodes BinaryConfiguration binCfg = new BinaryConfiguration(); binCfg.setIdMapper
// Configure Ignite to connect with .NET nodes
BinaryConfiguration binCfg = new BinaryConfiguration();
binCfg.setIdMapper(new BinaryBasicIdMapper());
binCfg.setNameMapper(new BinaryBasicNameMapper());
这适用于以下示例项目:
但是,如果您将这两个工作项目从Ignite 1.7.0升级到Ignite 2.0.0,您现在将得到以下异常(来自Java方面):
导致原因:class org.apache.ignite.spi.ignite异常:本地节点的二进制配置不等于远程节点的二进制配置[locNodeId=2d98d083-859f-4bae-bb9a-16fe00f9f39a,rmtNodeId=d9f68030-79b1-4e41-bd00-1bec44dca9e3,locBinaryCfg={globIdMapper=org.apache.ignite.binary.binarybasidMapper,compactFooter=true,globSerializer=null},rmtBinaryCfg={globIdMapper=null,compactFooter=true,globSerializer=null}]
您会注意到,在上述异常中,Java节点具有BinaryBasicId映射器设置,但是远程.NET节点不再具有此映射器,这导致了此异常
我尝试了以下方法,但没有效果:
- 删除BinaryBasicIdMapper(可以连接到集群,但不能反序列化对象,这是一个“未知对”异常)
- 使用true参数创建BinaryBasicNameMapper(以启用简单名称)。与上面相同的“未知对”异常
我一直在浏览Ignite文档,试图找出在Ignite 2.0中应该做什么,但我找不到任何例子。还有其他人遇到过这个问题吗?您是如何解决的?要在Ignite 2.0+中加入Java和.NET节点并将类型映射到彼此:
- 将
与两侧的BinaryBasicNameMapper
一起使用SimpleName
- 不要设置
IdMapper
- 使用
(Java)和ignite.binary().type(Foo.class)
(.NET)在两侧注册类型ignite.GetBinary().GetBinaryType(typeof(Foo))
详情: Ignite.NET 2.0+采用与Java以前相同的动态类型注册。启动节点之前,无需在BinaryConfiguration中注册类型。通常,您根本不需要注册类型(就像我们在GetBinaryType调用中所做的那样)-类型在首次使用时自动注册。但是,当涉及多个平台时,您可以获得此“未知对”异常,因为每个平台在一个单独的数据结构中注册类型。为什么?因为在反序列化时Ignite需要实例化一个实际的类。在.NET中,这个类可能是
Foo.Bar.Message
,在Javaorg.Foo.Bar.Message
中。因此,即使这两个类映射到相同的Ignite二进制类型(简单名称映射器丢弃名称空间/包),在反序列化时,我们需要知道完全限定的名称
我已经更新了有问题的,并在中添加了工作示例,谢谢Pavel,这很有效!现在我只需要尝试在配置类型样式中找到这样做的方法,以便于更新。我们的应用程序有很多类型:)。接受这个答案。@elumous您也可以通过
IgniteConfiguration.BinaryConfiguration
注册所有类型,这可以用XML完成。但是,您必须在所有节点上提供相同的JavaBinaryConfiguration
,包括.NET,其中通过IgniteConfiguration.SpringConfigUrl
完成。请告诉我f您需要这方面的帮助。太好了,谢谢您的指针!我能够区分出两种配置(一种用于Java,另一种用于.NET)并且能够在二进制配置中定义类型。我认为这会很好地工作!请注意,即使您已经在ignite.xml中使用了带有SimpleName的BinaryBasicNameMapper,您仍然需要在C#中指定它。