添加依賴
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