Spring-kafka連接Kafka 2.1.1生產者示例

一、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;
}

 

發佈了74 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章