首先创建生产者(producer )项目
在 pom.xml 中 导入对应的坐标
<!-- 这里只是关于kafka 的 -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-kafka -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-kafka</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
创建对应的 producer.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- <context:property-placeholder location="classpath:init.properties" /> -->
<!-- 定义producer的参数 -->
<bean id="producerProperties" class="java.util.HashMap">
<constructor-arg>
<map>
<!---->
<entry key="bootstrap.servers" value="127.0.0.1:9092"/>
<!--组名 消费者 生产者必须组名一致-->
<entry key="group.id" value="0"/>
<!--发送失败重试次数-->
<entry key="retries" value="10"/>
<!-- 批处理条数:当多个记录被发送到同一个分区时,生产者会尝试将记录合并到更少的请求中。这有助于客户端和服务器的性能。-->
<entry key="batch.size" value="16384"/>
<!--批处理延迟时间上限:即1ms过后,不管是否达到批处理数,都直接发送一次请求-->
<entry key="linger.ms" value="1"/>
<!-- 即32MB的批处理缓冲区-->
<entry key="buffer.memory" value="33554432"/>
<!--键的序列化-->
<entry key="key.serializer" value="org.apache.kafka.common.serialization.IntegerSerializer"/>
<!--值得序列化-->
<entry key="value.serializer" value="org.apache.kafka.common.serialization.StringSerializer"/>
</map>
</constructor-arg>
</bean>
<!-- 创建kafkatemplate需要使用的producerfactory bean -->
<bean id="producerFactory" class="org.springframework.kafka.core.DefaultKafkaProducerFactory">
<constructor-arg>
<ref bean="producerProperties"/>
</constructor-arg>
</bean>
<!-- 创建kafkatemplate bean,使用的时候,只需要注入这个bean,即可使用template的send消息方法 -->
<bean id="KafkaTemplate" class="org.springframework.kafka.core.KafkaTemplate">
<constructor-arg ref="producerFactory"/>
<!--是否自动刷新-->
<constructor-arg name="autoFlush" value="true"/>
<!--默认的主题 -->
<property name="defaultTopic" value="myTopic"/>
</bean>
</beans>
记得要在启动项目时 启动 zookeeper 和 kafka 然后在对应的controller 层中
@Controller
public class TestController {
@Autowired
private KafkaTemplate<Integer, String> kafkaTemplate;
@RequestMapping("test")
@ResponseBody
public String Test(){
for (int i = 0; i <100; i++) {
//test 主题名称
kafkaTemplate.send("test","hhhh");
}
return"aa";
}
}
直接访问口可以发送消息到test 主题下
再创建第二个项目 (consumer)
在pom.xml 中导入同样的坐标
创建对应的 consumer.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描properties 文件-->
<!-- <context:property-placeholder location="classpath:init.properties" /> -->
<!-- 定义consumer的参数 -->
<bean id="consumerProperties" class="java.util.HashMap">
<constructor-arg>
<map> <!--#brokers集群-->
<entry key="bootstrap.servers" value="127.0.0.1:9092"/>
<entry key="group.id" value="0"/>
<entry key="enable.auto.commit" value="true"/>
<entry key="auto.commit.interval.ms" value="1000"/>
<entry key="session.timeout.ms" value="15000"/>
<entry key="key.deserializer" value="org.apache.kafka.common.serialization.IntegerDeserializer"/>
<entry key="value.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer"/>
</map>
</constructor-arg>
</bean>
<!-- 创建consumerFactory bean -->
<bean id="consumerFactory" class="org.springframework.kafka.core.DefaultKafkaConsumerFactory">
<constructor-arg>
<ref bean="consumerProperties"/>
</constructor-arg>
</bean>
<!-- 实际执行消息消费的类 -->
<bean id="messageListernerConsumerService" class="demo.service.KafkaConsumerService"/>
<!-- 消费者容器配置信息 -->
<bean id="containerProperties" class="org.springframework.kafka.listener.config.ContainerProperties">
<!--处理哪个主题下的消息-->
<constructor-arg name="topics" value="test"/>
<!--消息监听-->
<property name="messageListener" ref="messageListernerConsumerService"/>
</bean>
<!-- 创建kafkatemplate bean,使用的时候,只需要注入这个bean -->
<bean id="messageListenerContainer" class="org.springframework.kafka.listener.KafkaMessageListenerContainer" init-method="doStart">
<constructor-arg ref="consumerFactory"/>
<constructor-arg ref="containerProperties"/>
</bean>
</beans>
创建对应的KafkaConsumerService类用来接收消息
package demo.service;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.listener.MessageListener;
public class KafkaConsumerService implements MessageListener<Integer, String>{
private static final Logger logger = LoggerFactory.getLogger(KafkaConsumerService.class);
public void onMessage(ConsumerRecord<Integer, String> arg0) {
logger.info("---------------Consumer---Message-------------"+arg0);
System.err.println("-----Consumer---Message--:"+arg0.value());
}
public static void main(String[] args) {
}
}
两个项目同时启动
就完成了最简单的 spring 整合 kafka