2017-05-29 5 views
1

私はbroadcast私のアプリのDBに格納されているIDを持ついくつかのエンティティのいくつかのApache Igniteタスク。 私はこの仕事をやめたいと思っています(私のアプリを再起動した後でも)。IgniteタスクのIDを返すことで、今後このタスクを停止する方法はありますか?

私はこの仕事のUUIDを返すために何とかしなければならないと思います(私はこの仕事をbroadcastとします)。このタスクUUIDを私のアプリケーションのDBのエンティティ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(); 
関連する問題