モードメッセージングプロデューサー
忘れられた送信モード(非同期伝送)を持っています
かかわらず、重複したメッセージ、メッセージ抜け、最速の、コールバックを考慮していません。重要情報は、多くの場合、回収操作ログ、ユーザーの閲覧トレースと上のように使用されています。
@Autowired
@Qualifier("producertemplate")
private KafkaTemplate<String, String> producertemplate;
public String testKafka(){
transactionalTemplate.send("topicname","sendMessage")
return null;
}
非同期伝送コールバック
コールバック関数は、二次治療の失敗や結果の成功の結果であり得ます。両方の低伝送効率を実施例を忘れよりも、方法を忘れて伝送信頼度より高い両方(それでも高いデータ20Wのまばたき時間を試験しました)
@Autowired
@Qualifier("producertemplate")
private KafkaTemplate<String, String> producertemplate;
public String testKafka(){
producertemplate.send("orderInfo",sendMessage).addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onFailure(Throwable throwable) {
log.info("msg send fail! exception : "+ throwable.getMessage()); //失败回调
}
@Override
public void onSuccess(SendResult<String, String> stringStringSendResult) {
log.info("msg send successful! topic : "+stringStringSendResult.getRecordMetadata().topic()+"msg : " +stringStringSendResult.getProducerRecord().value() ); //成功回调
}
});
return null;
}
同期伝送
メッセージを送信するときに同期伝送がブロックされている、いわゆる、ブローカーのコールバック結果をスレッドをブロックし、ブローカーノウハウコールバックの成功は継続されます、それ以外の場合は現在のスレッドをブロック。個人的に問題のほとんどは、スレッドは、それは非常に友好的ではない方法をブロックし、解決することができる送信される非同期コールバックを使用する必要を感じません
@Autowired
@Qualifier("producertemplate")
private KafkaTemplate<String, String> producertemplate;
private KafkaTemplate<String, String> transactionalTemplate;
public String testKafka(){
try {
SendResult<String, String> sendResult = producertemplate.send("hello", "message").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}
送信総務
なぜそれを送信するためにトランザクションを使うのか?
効果的に保証取引は、効果的なコールバック手段と連結された非繰り返しのメッセージは、そのような情報のための型として、失われたり繰り返されていない支払情報の種類をいい、メッセージを確実にすることができ送っすることができます。エラーが発生した場合、トランザクション・メッセージが繰り返されないことを確実にするため以外とtrantional注釈付きを追加する方法には、このアプローチは、メッセージは、ほとんどのデータベース・トランザクションの機能を、同じ化合物を送信されません。
テストのために+コールバック非同期的に送信されるトランザクションを使用して、このテストはそう。
私は2回の注入を持って気づいたかもしれません
@Autowired
@Qualifier("producertemplate")
private KafkaTemplate<String, String> producertemplate;
@Autowired
@Qualifier("transactionalTemplate")
private KafkaTemplate<String, String> transactionalTemplate;
どちらの違いは、トランザクションとの取引なし
transactionalTemplate idという名前の例にそれを変更するには、トランザクションを使用してオブジェクトを注入することができる注入する送信します。
@Autowired
@Qualifier("transactionalTemplate")
private KafkaTemplate<String, String> transactionalTemplate;
public String testKafka(){
transactionalTemplate.send("orderInfo",sendMessage).addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onFailure(Throwable throwable) {
log.info("msg send fail! exception : "+ throwable.getMessage()); //失败回调
}
@Override
public void onSuccess(SendResult<String, String> stringStringSendResult) {
log.info("msg send successful! topic : "+stringStringSendResult.getRecordMetadata().topic()+"msg : " +stringStringSendResult.getProducerRecord().value() ); //成功回调
}
});
return null;
}
ビジネスは、我々はツールを作成していないことを確認するために、未定と柔軟性の詳細ので、今、私たちが送信するために、非同期コールバック総務に+の方法を使用している、ビジネスシーンに応じて使用される特定の使用を送信総括するためにどの方法