2017-05-29 38 views
1

broadcast某些Apache Ignite任務的某些實體的ID存儲在我的應用的數據庫中。 在某些時候我想停止這個任務(甚至可能在重新啓動我的應用程序後)。如何返回Ignite任務的ID以便將來停止該任務?

爲此,我認爲我需要以某種方式返回此任務的UUID(當我此任務爲broadcast時),將此任務UUID保存在我的應用的數據庫中的實體ID附近,以便將來停止此任務。

這裏是我怎樣才能制止這種任務,如果我知道這個任務UUID(taskUuid)(Scala代碼):

val clusterGroup = ignite$.cluster().forServers() 
ignite$.compute(clusterGroup).broadcast(new IgniteRunnable { 
    override def run(): Unit = { 
    ignite$.compute().activeTaskFutures[Any]().asScala.filter(
     e => e._1.toString == taskUuid).foreach(e => e._2.cancel()) 
    } 
}) 

所以,我的問題是,我怎麼能回到這個taskUuid,當我提交了一些任務與IgniteCompute.broadcast(...)方法?

回答

1

這取決於Ignite版本。

由於2.0:您可以使用IgniteCompute.broadcastAsync,返回IgniteFuture。

2.0之前:有一個IgniteCompute.activeTaskFutures方法返回所有當前正在運行的任務由當前節點執行。您可以使用這些期貨取消任務。

+0

葉甫,似乎IgniteCompute.activeTaskFutures不會節點後工作重新開始。 – Yakov

+0

據我所知,異步回調只有在'broadcast'完成時纔會執行。 但它可能是長時間運行的操作,我想停止。 我知道我可以嘗試用'activeTaskFutures'來確定新提交的任務,但這將是不準確的解決方案。 –

2

可以異步執行任務,並從未來獲取此信息(這是Java代碼,但可以很容易地映射到斯卡拉):

IgniteCompute asyncCompute = ignite.compute().withAsync(); 

asyncCompute.broadcast(new MyRunnable()); 

ComputeTaskFuture<?> future = asyncCompute.future(); 

IgniteUuid id = future.getTaskSession().getId();