複数の投稿を介して行っていたが、それらのほとんどは、それらの処理中に例外処理について悪いメッセージはないの取り扱いに関連しています。
私は、ストリームアプリケーションによって受信されているメッセージを処理する方法に知ってほしいとメッセージの処理中に例外はありますか?例外があるため、ネットワークの障害、のRuntimeExceptionなどのような複数の理由であることができ、
- 誰かが行うための正しい方法は何か提案してもらえますか?私が使用する必要がありますか
setUncaughtExceptionHandler
?またはより良い方法はありますか? - 再試行を処理する方法は?
前もって感謝します!!
それはあなたがプロデューサー側の例外を除いてやりたいん何によって決まります。例外はプロデューサー(例えば、ネットワーク障害やカフカのブローカーによるが死亡した)にスローされます場合は、ストリームは、デフォルトでは死んでしまいます。そして、で、バージョン1.1.0を使用して、実装することで、デフォルトの動作をオーバーライドすることができカフカ・ストリームをProductionExceptionHandler
以下のように:
public class CustomProductionExceptionHandler implements ProductionExceptionHandler {
@Override
public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
final Exception exception) {
log.error("Kafka message marked as processed although it failed. Message: [{}], destination topic: [{}]", new String(record.value()), record.topic(), exception);
return ProductionExceptionHandlerResponse.CONTINUE;
}
@Override
public void configure(final Map<String, ?> configs) {
}
}
handleメソッドから、あなたはどちらかを返すことができCONTINUE
ますが、例外で死ぬストリームをしたくない場合はリターンに、FAIL
あなたはストリームを停止し(FAILがデフォルトです)したい場合に。あなたは、ストリームの設定でこのクラスを指定する必要が:
default.production.exception.handler=com.example.CustomProductionExceptionHandler
ことにも注意を払うProductionExceptionHandler
ハンドルプロデューサーの唯一の例外は、それがストリーム方式でメッセージの処理中に例外を処理しませんmapValues(..)
、filter(..)
、branch(..)
などを、あなたはのtry / catchブロックでこれらのメソッドのロジックをラップする必要がありますが(という保証にtryブロックの中に、すべてのメソッドのロジックを置きますあなたはすべての例外的なケースを処理します):
.filter((key, value) -> { try {..} catch (Exception e) {..} })
私が知っているように、我々はカフカのストリームは、後で消費し、自動的に再試行されますよう、明示的に消費者側のハンドル例外にする必要はありません(メッセージが消費され、処理されるまで変更されませんオフセットとして)。例えばもしカフカブローカーは、あなたがカフカのストリームからの例外を得ただろう、とアップになります壊れたときに、カフカストリームは、すべてのメッセージを消費しますが、いくつかの時間のために到達できないだろう。したがって、この場合には、我々はちょうど遅延と何が破損/紛失しています。
setUncaughtExceptionHandler
あなたはと同じように、デフォルトの動作を変更することはできませんProductionExceptionHandler
、それをあなたが唯一の失敗トピックにエラーまたは送信メッセージをログに記録できます。