spring 整合kafka 详解

首先创建生产者(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值