在闭包中使用 ignite 安全吗?

Is it safe to use ignite within a closure?

我正在使用 ignite 服务,它将通过 run 发布一些任务。服务看起来像这样:

public interface MySvc{
    public void foSomeJob();
}

public MySvcImpl implements MySvc, Service{

    @IgniteInstanceResource
    private Ignite ignite;

    public void foSomeJob(){
        IgniteCompute compute = ignite.compute();
        compute.run(() -> {
             ignite.binary()         //<----Is it safe? 
                   .builder("TYPE"); // What is gonna happen on another node
             //build binary object and put it into a cache
        }
    }
}

问题是在另一个节点上会发生什么?我们序列化 Ignite 实例(真的??)并通过网络发送它。或者它是如何工作的?

在我的例子中,任务的性能是至关重要的...所以我想了解在 运行 另一个节点上的任务的情况下它是如何工作的?

也许我应该明确地使用 Ignition.ignite();

在你的例子中,如果你使用 lambda,它会序列化这个 ignite 对象。

您可以创建 class 以将其用作 compute() 中的参数并在此 class.

中使用 @IgniteInstanceResource 注释来代替它

@IgniteInstanceResource 注释注入一个当前的点燃实例。在这个闭包 运行 的那一刻,你将有一个 ignite 实例,它执行这个闭包。

Ignite 实例确实是 "serialized",在远程节点上,您实际上将获得该节点本地的实例。 Ignite当然不会通过网络物理发送。

话虽如此,这段代码是正确的并且可以工作。但是,对通过网络发送的闭包使用 lambda 或匿名 classes 并不是一个很好的做法。我建议创建一个单独的 class 并使用 @IgniteInstanceResourceIgnition.ignite() 注入 Ignite。这样您就可以更好地控制序列化和通过网络发送的内容。从性能的角度来看,它更安全、更好。