一、maven
<spring.version>4.3.4.RELEASE</spring.version>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.2.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.1.1</version>
</dependency>
二、spring-kafka-producer.xml
kafka.sasl.jaas.config=
org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka_test" password="kafka_test";
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="defaultKafkaProducerFactory" class="org.springframework.kafka.core.DefaultKafkaProducerFactory">
<constructor-arg>
<map>
<entry key="bootstrap.servers" value="${kafka.bootstrap.servers}"/>
<entry key="linger.ms" value="${kafka.linger.ms}"/>
<entry key="batch.size" value="${kafka.batch.size}"/>
<entry key="client.id" value="${kafka.client.id}"/>
<entry key="key.serializer" value="org.apache.kafka.common.serialization.StringSerializer"/>
<entry key="value.serializer" value="org.apache.kafka.common.serialization.StringSerializer"/>
<entry key="security.protocol" value="SASL_PLAINTEXT"/>
<entry key="sasl.mechanism" value="SCRAM-SHA-256"/>
<entry key="sasl.jaas.config" value="${kafka.sasl.jaas.config}"/>
</map>
</constructor-arg>
</bean>
<bean id="kafkaTemplate" class="org.springframework.kafka.core.KafkaTemplate">
<constructor-arg name="producerFactory" ref="defaultKafkaProducerFactory"/>
<constructor-arg name="autoFlush" value="true"/>
</bean>
</beans>
三、發送結果處理類:
public class KafkaResultHandler {
private final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 處理正常結果
*/
public void handleSuccess(SendResult<Integer, String> result) {
}
/**
* 處理異常結果
*/
public void handleError(Throwable ex, Object model) {
log.error(ex.getMessage(), ex);
}
}
四、發送消息代碼:
private KafkaResultHandler resultHandler = new KafkaResultHandler();
doSend("發送的topic", "發送的內容", System.currentTimeMillis());
private void doSend(String topic, final Object data, long time) {
final ProducerRecord<String, String> record = createRecord(topic, data);
if (record != null) {
ListenableFuture<SendResult<Integer, String>> future = kafkaTemplate.send(record);
future.addCallback(new ListenableFutureCallback<SendResult<Integer, String>>() {
@Override
public void onFailure(Throwable ex) {
resultHandler.handleError(ex, data);
LOG.info("kafka數據推送失敗時間消耗:{}", System.currentTimeMillis() - time);
}
@Override
public void onSuccess(SendResult<Integer, String> result) {
resultHandler.handleSuccess(result);
LOG.info("kafka數據推送成功時間消耗:{}", System.currentTimeMillis() - time);
}
});
}
}
/**
* 創建 Kafka Message Record
*
* @param data
* @return
*/
private ProducerRecord<String, String> createRecord(String topic, Object data) {
if (topic != null && data != null) {
return new ProducerRecord<>(topic, JSON.toJSONString(data));
}
LOG.error("創建 Kafka Record 失敗,topic = {},model = {}", topic, data);
return null;
}