2017-11-17 23 views
-1

将来、非同期実行に使用するアプリケーションがあります。
私はそれが応答を取得していない場合、スレッドは、10秒後に殺さなければならないこと、getメソッドにパラメータを設定します。Future.get(...)がスレッドを強制終了しないのはなぜですか?

Future<RecordMetadata> meta = producer.send(record, new ProducerCallBack()); 
     RecordMetadata data = meta.get(10, TimeUnit.SECONDS); 

しかし、スレッドは60秒後に殺さ:

java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms. 
    at org.apache.kafka.clients.producer.KafkaProducer$FutureFailure.<init>(KafkaProducer.java:1124) 
    at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:823) 
    at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:760) 
    at io.khinkali.KafkaProducerClient.main(KafkaProducerClient.java:49) 
Caused by: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms. 

私は間違って何をしていますか? docsから

+0

タイムアウトの値を高く設定する –

+0

私は10秒に変更します。 –

+0

https://stackoverflow.com/questions/38457706/error-error-when-sending-message-to-topic –

答えて

2

:ブロックする時間

閾値は、それがTimeoutExceptionをスロー 後max.block.msによって決定されます。

logback.xmlでチェックカフカアペンダの設定、探し:

<producerConfig>max.block.ms=60000</producerConfig> 
+2

それは魅力のように動作します。本当にありがとう。 –

1

私はそれを取得しないと、スレッドは、10秒後に殺さなければならないこと、getメソッドにパラメータを設定します応答:

私たちがFuture.get(...)について話しているのであれば、スレッドを「殺す」ことはまったくありません。 、javadocsからFuture.get(...)方法を引用すると:

ウェイツ必要に応じてのための計算が完了し、利用可能な場合、その後、その結果を取得するための最も所定の時間で。

get(...)方法がタイムアウトそれはTimeoutExceptionがスローされますが、あなたのスレッドが実行を継続して自由である場合。スレッドの実行を停止したい場合は、TimeoutExceptionをキャッチしてからmeta.cancel(true)にコールする必要がありますが、それでもスレッドが "強制終了"されることはありません。これにより、スレッドが中断されます。つまり、certain methods will throw InterruptedExceptionまたはスレッドがThread.currentThread().isInterrupted()をチェックする必要があります。

java.util.concurrent.ExecutionException:org.apache.kafka.common.errors.TimeoutException:60000ミリ秒後にメタデータを更新できませんでした。

はい、このタイムアウトは、Future.get(...)タイムアウトとは関係ありません。

関連する問題