版本对应关系:spring.io/projects/sp…
1. 引入依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2. 相关配置
server.port=7271
#spring.kafka.bootstrap-servers=192.168.44.161:9093,192.168.44.161:9094,192.168.44.161:9095
spring.kafka.bootstrap-servers=localhost:9092
# producer
spring.kafka.producer.retries=1
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.acks=all
spring.kafka.producer.properties.linger.ms=5
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
# consumer
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=1000
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
3. 消费者
使用注解@KafkaListener监听topic:
@Component
public class ConsumerListener {
@KafkaListener(topics = "springboottopic", groupId = "springboottopic-group")
public void onMessage(String msg) {
System.out.println("----收到消息:" + msg + "----");
}
}
4. 生产者
注入模板方法KafkaTemplate发送消息。
注意send方法有很多重载方法,异步回调ListenableFuture。
使用Component是为了防止注入容器有同名。或者取名的时候注意一点即可。
@Component(value = "kafkaTest")
public class KafkaProducer {
@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;
public String send(@RequestParam String msg) {
kafkaTemplate.send("springboottopic", msg);
return "ok";
}
}
5. 测试
先启动Application,启动消费者监听,然后运行单元测试类即可。
@SpringBootTest
class KafkaTests {
@Autowired
@Qualifier("kafkaTest")
KafkaProducer producer;
// 消费者:先启动 kafkaApp
@Test
void testSendMsg() {
long time = System.currentTimeMillis();
System.out.println("----" + time + ",已经发出----");
producer.send("penyuyan, " + time);
}
}
6. 总结
经过了Spring的封装,基于Kafka实现异步通信变得更加简单了,和其他的中间件一样,这样我们就可以更加专注于业务的开发,而不用重复的开发底层组件。