如果是我自己的类型,ApacheIgnite会让远程服务代理方法返回代理吗?

如果是我自己的类型,ApacheIgnite会让远程服务代理方法返回代理吗?,ignite,Ignite,我的一个服务方法返回一个属于我自己的类的非基本对象 该服务是集群单例服务,因此我希望它主要通过它在不同节点上的代理来使用 这个方法将返回什么?它也会是我的对象的代理吗?或者它会尝试在远程计算机上序列化它,并在本地计算机上反序列化它 技巧在于返回的对象包含对服务本身的引用 如果发生序列化/反序列化,我希望Ignite在本地计算机上进行反序列化期间使用服务代理替换此引用。会发生吗 否则,我希望它能从返回的对象中生成一个代理,尽管这是一个更糟糕的场景,因为在处理这个对象时会发生更大的网络交互 最糟糕的

我的一个服务方法返回一个属于我自己的类的非基本对象

该服务是集群单例服务,因此我希望它主要通过它在不同节点上的代理来使用

这个方法将返回什么?它也会是我的对象的代理吗?或者它会尝试在远程计算机上序列化它,并在本地计算机上反序列化它

技巧在于返回的对象包含对服务本身的引用

  • 如果发生序列化/反序列化,我希望Ignite在本地计算机上进行反序列化期间使用服务代理替换此引用。会发生吗
  • 否则,我希望它能从返回的对象中生成一个代理,尽管这是一个更糟糕的场景,因为在处理这个对象时会发生更大的网络交互
  • 最糟糕的情况是服务代理只能返回原语或标准
  • 深入源代码和文档,我找不到我的答案,请告知。将会发生什么:

  • 反序列化/替换内部引用
  • 代理
  • 失败
  • 其他的
  • 将发生-您的自定义对象将被序列化并通过网络发送
  • 你的服务会怎么样,我不完全确定。也许它还将被序列化并通过网络发送:)当然,在这种情况下,它将成为一个不同的实例


    现在,如果让对象引用服务代理而不是服务本身(Ignite之外的原始对象),结果可能会不同。

    为什么要返回服务的副本?调用方已具有对服务的引用。感觉上您不必要地向客户机公开了您的实现。最好返回一个没有引用的副本。@StephenDarlington,该服务创建了一个对象,该对象需要为某些内部处理保留对创建它的服务的引用。无法从该对象获取服务实例,因为没有合适的getter。确切地说:内部处理。该数据不应返回给客户端。您可以返回一个唯一的标识符,这样服务就可以根据需要存储和检索对象,而不是返回整个服务对象。我不想返回整个服务对象。例如,如果Ignite在反序列化过程中将服务对象替换为其代理,我会很好。我希望在本地进行一些计算,而不是将其全部委托给较差的远程singleton服务,因此它们是在返回的对象方法中完成的。但是有一小部分需要不时地从原始服务中检索,因为它是一个单例并跟踪某些集合>内部处理。该数据不应返回到客户机。>在这种情况下,它将成为一个不同的实例,这使它实际上不是一个集群。因此,您需要始终在当前节点上检索一个新的服务代理。我的服务不知道它是从外部调用的,也无法从远程调用它的计算机获取任何信息,因此它无法创建对象并将自己的代理放在那里,而不是自己,也就是说,如果您让对象引用服务代理而不是服务本身,那么您的服务肯定会调用
    init()
    ,此时它可以初始化它想要的一切。然后,您的对象可以有一个
    @IgniteInstanceResource
    字段,并从中按名称检索服务代理。这可能是个好主意,但我不能遵循它,因为我的整个库都是不可知的,我只是将其重写为“Ignite ready”和所有面向服务的,但我不想将其锁定