2017-05-18 21 views
0

我正在通過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();

回答

1

在你的情況,如果你使用lambda,它會序列化這個點燃對象。

而不是它,您可以創建類以將其用作compute()中的參數,並在此類中使用@IgniteInstanceResource註釋。

@IgniteInstanceResource註釋注入當前點燃實例。在運行這個閉包的時候,你將會有一個點燃的實例,它會執行這個閉包。

+0

所以,是的。 'Ignition.localIgnite'會有幫助。但是'IgniteCache'呢?從封閉使用它是否安全?我的意思是在'affinityRun'時在閉包內使用'IgniteCache cache'引用? –

+0

在這種情況下,您不需要通過緩存(名稱)或getOrCreateCache方法從Ignite中獲取IgniteCache對象 –

3

Ignite實例將確實是「序列化」的,並且在遠程節點上,您將實際獲得該節點本地的實例。當然,Ignite不是通過網絡物理髮送的。

話雖如此,此代碼是正確的,將工作。但是,使用lambdas或匿名類通過網絡發送閉包並不是一個很好的做法。我建議創建一個單獨的課程並使用@IgniteInstanceResourceIgnition.ignite()注入Ignite。這樣你就可以更好地控制序列化和通過網絡發送的內容。從性能角度來看,它更安全更好。

+0

在每個任務中注入'@ IgniteInstanceResource'?我認爲它使用了反射。所以在大量任務的情況下會損害性能...... –

+0

順便說一句,爲什麼不使用'Ignition.localIgnite()'? –

+1

如果正確完成,反射速度並不慢:) Ignite有一個反射緩存來處理此問題。 'localIgnite()'較重,因爲它必須先查找名稱。有了'ignite()'方法,你可以明確地提供它。 –

相關問題