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