私は他のボルトからデータを収集するボルトを持っています。ボルトに十分なデータがあるか、時間が経過すると、このボルトは収集されたデータに基づいて時間のかかる作業を行います。ストームボルトのスレッドセーフ
私の質問は、時間のかかる仕事の中で、他のボルトがこのボルトにデータを送信し続けなければならないということです。これはスレッドセーフな問題を引き起こしますか?時間のかかるジョブを実行するときにロックを追加する必要がありますか?
類似の投稿hereがありますが、私はその答えを理解できません。
以下の語数のボルトを考えてみましょう.1つのメッセージがこのボルトに到達するとすぐに1つのインスタンスにしかアクセスできません。マップは空であるため、時間のかかる仕事を開始します。その間、私の理解では、他のスパウト/ボルトはまだ実行されており、このボルトにメッセージを送っています。しかし、最初のメッセージはまだマップされていないので、これらの新しいメッセージは時間のかかる作業を何度も繰り返すでしょう。これはスレッドセーフな問題を引き起こしませんか?
public static class WordCount extends BaseRichBolt {
Map<String, Integer> counts = new HashMap<String, Integer>();
@Override
public void execute(Tuple tuple) {
collect.ack(tuple); // ack upon receiving the message
String word = tuple.getString(0);
Integer count = counts.get(word);
if (count == null){
// doing time-consuming job here
count = 0;
}
count++;
counts.put(word, count);
collector.emit(new Values(word, count));
}
}
あなたのコードに関するいくつかのコメント/アドバイス:正確にこれらのシナリオのために作られたバッチボルトを使用することができます(データ収集とバッチ実行)。あなたはデータが処理された後には直ちに応答するべきです(例[here](http://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html)を参照)。 – thisismydesign