2017-06-28 8 views
0

Java APIを使用しているときに、メインスレッドが2000ns未満でスリープ状態になると、メッセージをプロデュースできません。なぜこれが起こるのか本当に知りたいですか?ここでメインスレッドが1000未満でスリープしたときにメッセージを生成できない

は私のプロデューサーです:

public class Producer { 
    private final KafkaProducer<String, String> producer; 
    private final String topic; 

    public Producer(String topic, String[] args) { 
     //...... 
     //...... 
     producer = new KafkaProducer<>(props); 
     this.topic = topic; 
    } 

    public void producerMsg() throws InterruptedException { 
     String data = "Apache Storm is a free and open source distributed"; 
     data = data.replaceAll("[\\pP‘’“”]", ""); 
     String[] words = data.split(" "); 
     Random _rand = new Random(); 

     Random rnd = new Random(); 
     int events = 10; 
     for (long nEvents = 0; nEvents < events; nEvents++) { 
      long runtime = new Date().getTime(); 
      int lastIPnum = rnd.nextInt(255); 
      String ip = "192.168.2." + lastIPnum; 
      String msg = words[_rand.nextInt(words.length)]; 
      try { 
       producer.send(new ProducerRecord<>(topic, ip, msg)); 
       System.out.println("Sent message: (" + ip + ", " + msg + ")"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     Producer producer = new Producer(Constants.TOPIC, args); 
     producer.producerMsg(); 
     //If I write Thread.sleep(1000),It will not work!!!!!!!!!!!!!!!!!!!! 
     Thread.sleep(2000); 
    } 
} 

答えて

0

はあなたがプロデューサーを構成するために使用されている小道具を示すことができることを理解しますか?私はそれが可能であることを推測しているだけです...

producerMsg()では、プロデューサを使用するために非同期的な方法を使用していますので、メッセージは内部バッファに入れられます後で送られるバッチを作る。プロデューサには、バッファから取得してバッチを送信する内部スレッドがあります。プロデューサが実際にメッセージを送信する条件(batch.sizeとlinger.msを参照)に達するには1000ミリ秒では不十分で、メインアプリケーションは終了し、プロデューサはメッセージを送信せずに終了します。それに多くの時間(2000ミリ秒)を与えて、それは動作します。 Btw、私はコードを試していない。

だから、その理由は、あなたのようだ:あなたの睡眠と一致

props.put("linger.ms", 1000);

。したがって、バッチがまだいっぱいではないため、プロデューサは1000ミリ秒後にメッセージを送信し始めます(batch.sizeは16 MBです)。同時に、メインスレッドは1秒間スリープした後に終了し、プロデューサはメッセージを送信しません。あなたはより低いlinger.ms時間を使用しなければなりません。

+0

OK、私の小道具を見ることができます – Gpwner

+0

私はあなたが正しいと思う、ありがとう!! – Gpwner

+0

私は以前の回答を更新しました;) – ppatierno

関連する問題