カスタムプロデューサーインターセプタは、次の2つの関数を実行します。
- プッシュメッセージブローカは、メッセージヘッダ内のタイムスタンプの前
- コールバックを押すと、統計的な失敗の数は、成功のメッセージを送信します
例:タイムスタンプインターセプターの定義
輸入org.apache.kafka.clients.producer.ProducerInterceptor; 輸入org.apache.kafka.clients.producer.ProducerRecord; 輸入org.apache.kafka.clients.producer.RecordMetadata; 輸入java.util.Map; / ** * * *複数のスレッドを実行することができ、ユーザーはセキュリティスレッドを確保するための責任があります * * * / パブリック クラス TimeStampPrependerInterceptor 実装 ProducerInterceptor <文字列、文字列> { // メインユーザースレッドで実行されると、メッセージは呼び出しのシーケンスですが、パーティションおよびトピックのメッセージを変更しない属し前に 公共 ProducerRecord <文字列、文字列> onSend(ProducerRecord <文字列、文字列> レコード){ 返す 新しい新しい ProducerRecordを<文字列、文字列> (record.topic()、 record.partition()、record.timestamp()、record.key()、 System.currentTimeMillis() + "" + record.value()のtoString())。 } // または呼び出しが重いのロジックに参加していない、メッセージは、答えは通常プロデューサーのコールバック・ロジック・トリガの前に、IOスレッドproduerを実行する前に、メッセージの送信に失敗しました 公共 のボイドonAcknowledgement(RecordMetadataメタデータ、例外例外){ } // クリーンアップ 公共 のボイドの使用を閉じます(){ } // 初期化 、公共 のボイドのconfigure(地図<文字列、?> Configsを){ } }
メッセージインターセプタの数のカスタム統計:
輸入org.apache.kafka.clients.producer.ProducerInterceptor; 輸入org.apache.kafka.clients.producer.ProducerRecord; 輸入org.apache.kafka.clients.producer.RecordMetadata; 輸入java.util.Map; パブリック クラス CounterInterceptor 実装 ProducerInterceptor <文字列、文字列> { プライベート int型 errorCounter = 0 ; プライベート int型 successCounter = 0 ; 公共 ProducerRecord <文字列、文字列> onSend(ProducerRecord <文字列、文字列> レコード){ 戻りレコード。 } 公共 ボイドonAcknowledgement(RecordMetadataメタデータ、例外例外){ 場合(例外== NULL ){ successCounter ++ ; } 他{ errorCounter ++ ; } } 公共 空に近いです(){ System.out.println( "成功して送信:" + successCounter)。 System.out.printlnは( "送信されませんでした:" + errorCounter)。 } 公共 のボイドのconfigure(地図<文字列、?> コンフィグ){ } }
インターセプタメインクラスの設定を追加します。
一覧<文字列>インターセプター= 新しいのArrayList <文字列> (); interceptors.add( "cn.org.fubin.producer.TimeStampPrependerInterceptor" ); interceptors.add( "cn.org.fubin.producer.CounterInterceptor" ); properties.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG、インターセプタ)。 文字列のトピック =「テストトピック」; プロデューサー <文字列、文字列>プロデューサー= 新しい KafkaProducer <文字列、文字列> (プロパティ)。 以下のために(INT iは= 0; I <10; I ++ ){ ProducerRecord <文字列、文字列>のレコード= 新 ProducerRecord <文字列、文字列>(トピック、 "メッセージ" + I)。 producer.send(レコード)に.get(); }
最初のオープンプッシュ消費者のメッセージングプログラムを実行する前に、インターセプタは効果かどうかを確認します。
ビン/カフカ-コンソール-消費者。SH --bootstrapサーバはlocalhost:9092、localhostを:9093、localhostを:9094 --topicテストトピック
次のようにメッセージは次のとおりです。
1558785539173 、message0 1558785539476 、メッセージ1 1558785539490 、メッセージ2 1558785539504 、message3 1558785539521 、message4 1558785539535 、message5 1558785539547 、message6 1558785539562 、message7 1558785539574 、メッセージ8 1558785539587、message9