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

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