Spring中使用kafka

添加依賴

Maven中引用依賴

<!-- kafka -->
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

Graden以下示例顯示瞭如何使用Gradle進行操作:

compile 'org.springframework.kafka:spring-kafka'

kafka可視化工具

         我這裏建議入門的使用 kafka tools,這個工具簡單易懂。下載地址:URL ,當然也可以從我上傳的文件下載,URL

創建topic 

        KafkaTemplate在發送的時候就已經幫我們完成了創建的操作,所以我們不需要主動創建Topic,而是交由KafkaTemplate去完成。但這樣也出現了問題,這種情況創建出來的Topic的Partition(分區)數永遠只有1個,也不會有副本(不知道的回爐重造,Kafka部署集羣時使用的),這就導致了我們在後期不能順利擴展。所以這種情況我們需要使用代碼手動去創建Topic。

 @Bean
 public NewTopic topic() {
    return new NewTopic("topic1", 3, (short) 1);
}
//創建TopicName爲topic1的Topic並設置分區數爲3以及副本數爲2  dlt爲死信隊列
@Bean
public NewTopic dlt() {
    return new NewTopic("topic1.DLT", 3, (short) 2);
}

        後期我們想增加分區數來提高系統吞吐量,這樣我們就需要修改一下Topic的分區數了。實現也非常簡單,只需要修改在我們剛纔編寫的topic()方法的第二個參數, 緊接着重啓一下項目即可。修改分區數並不會導致數據的丟失,但是分區數只能增大不能減小。

發送消息和接受消息

//自動配置 還有就是 會掃描該包下的所有註解類
@SpringBootApplication
public class RnpApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(RnpApplication.class, args);
    }
}
package com.cloud.ceres.rnp.configuration;

import com.cloud.ceres.rnp.RnpApplication;
import com.cloud.ceres.rnp.kafkaDto.Foo2;
import org.apache.kafka.clients.admin.NewTopic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.kafka.ConcurrentKafkaListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.DeadLetterPublishingRecoverer;
import org.springframework.kafka.listener.SeekToCurrentErrorHandler;
import org.springframework.kafka.support.converter.RecordMessageConverter;
import org.springframework.kafka.support.converter.StringJsonMessageConverter;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class KafkaInitialConfiguration {

    Logger logger = LoggerFactory.getLogger(RnpApplication.class);

    @Bean
    public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer,//yml配置
                                                                                       ConsumerFactory<Object, Object> kafkaConsumerFactory,//默認的消費工廠
                                                                                       KafkaTemplate<Object, Object> template) {
        ConcurrentKafkaListenerContainerFactory <Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        configurer.configure(factory, kafkaConsumerFactory);
        // 配置一個消費的消息處理異常處理器:重試3次還不成功則將該消息發到死信topic裏。
        factory.setErrorHandler(new SeekToCurrentErrorHandler(new DeadLetterPublishingRecoverer(template), 3)); // dead-letter
        return factory;
    }
    //將josn字節轉爲你想強轉的對象
    @Bean
    public RecordMessageConverter converter() {
        return new StringJsonMessageConverter();
    }


    //註解的形式創建topic  分區數 和 副本數
    @Bean
    public NewTopic topic() {
        return new NewTopic("topic1", 1, (short) 1);
    }
    @Bean
    public NewTopic dlt() {
        return new NewTopic("topic1.DLT", 1, (short) 1);
    }

    @KafkaListener(id = "myGroup", topics = "topic1")
    public void listen(Foo2 foo) {//自動轉化Foo2
        logger.info("Received: " + foo);
        if (foo.getFoo().startsWith("fail")) {
            throw new RuntimeException("failed");
        }
    }

    @KafkaListener(id = "dltGroup", topics = "topic1.DLT")
    public void dltListen(String in) {
        logger.info("Received from DLT: " + in);
    }
}
package com.cloud.ceres.rnp.kafkaDto;

public class Foo1 {

	private String foo;

	public Foo1() {
		super();
	}

	public Foo1(String foo) {
		this.foo = foo;
	}

	public String getFoo() {
		return this.foo;
	}

	public void setFoo(String foo) {
		this.foo = foo;
	}

	@Override
	public String toString() {
		return "Foo1 [foo=" + this.foo + "]";
	}

}

package com.cloud.ceres.rnp.kafkaDto;

public class Foo2 {

	private String foo;

	public Foo2() {
		super();
	}

	public Foo2(String foo) {
		this.foo = foo;
	}

	public String getFoo() {
		return this.foo;
	}

	public void setFoo(String foo) {
		this.foo = foo;
	}

	@Override
	public String toString() {
		return "Foo2 [foo=" + this.foo + "]";
	}

}


 

參考:https://www.jianshu.com/p/aa196f24f332

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章