我正在使用点火服务,该服务将通过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();
?
答案 0 :(得分:3)
Ignite
实例将确实&#34;序列化&#34;,并且在远程节点上,您实际上将获得该节点本地的实例。当然,Ignite
不是通过网络实际发送的。
话虽如此,这段代码是正确的并且可行。但是,对于通过网络发送的闭包使用lambdas或匿名类不是一个很好的做法。我建议创建一个单独的类,并使用@IgniteInstanceResource
或Ignition.ignite()
注入Ignite。通过这种方式,您可以更好地控制序列化和通过网络发送的内容。从性能角度来看,它更安全,更好。
答案 1 :(得分:1)
在您的情况下,如果您使用lambda,它将序列化此点燃对象。
除了它之外,您可以创建类以将其用作compute()中的参数,并在此类中使用@IgniteInstanceResource注释。
@IgniteInstanceResource注释会注入当前的点燃实例。在运行此闭包的那一刻,您将拥有一个执行此闭包的点火实例。