spring+Kafka+springmvc Demo
一、下载(官网下载:http://kafka.apache.org/downloads.html)
任意下载一个zip
二、制作demo示例,spring+springmvc+Kafka
开发前请先安装zookeeper,传送门
1. 启动kafka服务:安装目录下.\bin\windows\kafka-server-start.bat .\config\server.properties
启动zookeeper:进入zk的安装文件夹bin目录下双击zkServer.bat文件(因为kafka的topic需要在zk注册中心注册)
2.创建topic:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
3.引入maven依赖,其中引入了多余的依赖,直接从笔者的demo项目中复制过来
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.10</artifactId> <version>0.8.2.1</version> <exclusions> <exclusion> <artifactId>jmxri</artifactId> <groupId>com.sun.jmx</groupId> </exclusion> <exclusion> <artifactId>jms</artifactId> <groupId>javax.jms</groupId> </exclusion> <exclusion> <artifactId>jmxtools</artifactId> <groupId>com.sun.jdmk</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>1.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.9.0.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.22</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>1.2.15</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.9</version> </dependency> <dependency> <groupId>carhouse-test</groupId> <artifactId>carhouse-test-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.7.5.RELEASE</version> </dependency>
4.producer配置(kafka-producer.xml)
<!--基本配置 --> <bean id="producerProperties" class="java.util.HashMap"> <constructor-arg> <map> <!-- kafka服务地址,可能是集群--> <entry key="bootstrap.servers" value="localhost:9092,localhost:9093,localhost:9094" /> <!-- 有可能导致broker接收到重复的消息,默认值为3--> <entry key="retries" value="10" /> <!-- 每次批量发送消息的数量--> <entry key="batch.size" value="1638" /> <!-- 默认0ms,在异步IO线程被触发后(任何一个topic,partition满都可以触发)--> <entry key="linger.ms" value="1" /> <!--producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常 --> <entry key="buffer.memory" value="33554432 " /> <!-- producer需要server接收到数据之后发出的确认接收的信号,此项配置就是指procuder需要多少个这样的确认信号--> <entry key="acks" value="all" /> <entry key="key.serializer" value="org.apache.kafka.common.serialization.StringSerializer" /> <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" /> <!--设置对应topic--> <property name="defaultTopic" value="test" /> </bean>
5.consumer配置(kafka-consumer.xml)
<bean id="consumerProperties" class="java.util.HashMap"> <constructor-arg> <map> <!--Kafka服务地址 --> <entry key="bootstrap.servers" value="localhost:9092" /> <!--Consumer的组ID,相同goup.id的consumer属于同一个组。 --> <entry key="group.id" value="order-beta" /> <!--如果此值设置为true,consumer会周期性的把当前消费的offset值保存到zookeeper。当consumer失败重启之后将会使用此值作为新开始消费的值。 --> <entry key="enable.auto.commit" value="true" /> <!--网络请求的socket超时时间。实际超时时间由max.fetch.wait + socket.timeout.ms 确定 --> <entry key="session.timeout.ms" value="15000 " /> <entry key="key.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer" /> <entry key="value.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer" /> </map> </constructor-arg> </bean> <!--指定具体监听类的bean --> <bean id="messageListernerConsumerService" class="mq.kafka.KafkaConsumerListener" /> <!-- 创建consumerFactory bean --> <bean id="consumerFactory" class="org.springframework.kafka.core.DefaultKafkaConsumerFactory"> <constructor-arg> <ref bean="consumerProperties"/> </constructor-arg> </bean> <bean id="containerProperties" class="org.springframework.kafka.listener.config.ContainerProperties"> <constructor-arg value="test"/> <property name="messageListener" ref="messageListernerConsumerService"/> </bean> <bean id="messageListenerContainer" class="org.springframework.kafka.listener.KafkaMessageListenerContainer" init-method="doStart"> <constructor-arg ref="consumerFactory"/> <constructor-arg ref="containerProperties"/> </bean>
5.在spring-mvc.xml的额外配置
<!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:application name="test-provider"/> <dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181"/> <!-- 引入kafka配置文件,根据个人文件位置--> <import resource="classpath:./kafka/kafka-producer.xml"/> <import resource="classpath:./kafka/kafka-consumer.xml"/>
6.实际使用
最简单的一条消息发送
@Resource private KafkaTemplate<Integer, String> kafkaTemplate; @RequestMapping(value = "/hello.do") public void hello(){ kafkaTemplate.sendDefault("test it"); }
消息消费
import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.listener.MessageListener; public class KafkaConsumerListener implements MessageListener<Integer, String> {
public void onMessage(ConsumerRecord<Integer, String> consumerRecord) { Object o = consumerRecord.value(); System.out.println(String.valueOf(o)); } }
最后会在控制台输出“test it”
作者:紫荆王朝
来源:CSDN
原文:https://blog.csdn.net/wu18296184782/article/details/80164190