在封闭内使用点火是否安全?

时间:2017-05-18 13:00:38

标签: java 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();

2 个答案:

答案 0 :(得分:3)

Ignite实例将确实&#34;序列化&#34;,并且在远程节点上,您实际上将获得该节点本地的实例。当然,Ignite不是通过网络实际发送的。

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

答案 1 :(得分:1)

在您的情况下,如果您使用lambda,它将序列化此点燃对象。

除了它之外,您可以创建类以将其用作compute()中的参数,并在此类中使用@IgniteInstanceResource注释。

@IgniteInstanceResource注释会注入当前的点燃实例。在运行此闭包的那一刻,您将拥有一个执行此闭包的点火实例。