您的位置:首页 > 编程语言 > Java开发

spring-kafka手动提交offset

2017-03-27 21:09 411 查看
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4        xsi:schemaLocation="http://www.springframework.org/schema/beans
5          http://www.springframework.org/schema/beans/spring-beans.xsd"> 6
7
8     <bean id="consumerProperties" class="java.util.HashMap">
9         <constructor-arg>
10             <map>
11                 <entry key="bootstrap.servers" value="${bootstrap.servers}"/>
12                 <!-- 指定消费组名 -->
13                 <entry key="group.id" value="friend-group"/>
14                 <entry key="enable.auto.commit" value="false"/>
15                 <entry key="auto.commit.interval.ms" value="1000"/>
16                 <entry key="session.timeout.ms" value="15000"/>
17                 <entry key="max.poll.records" value="1"/>
18                 <entry key="key.deserializer" value="org.apache.kafka.common.serialization.IntegerDeserializer"/>
19                 <!--<entry key="key.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer"/>-->
20                 <entry key="value.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer"/>
21             </map>
22         </constructor-arg>
23     </bean>
24
25     <bean id="consumerFactory" class="org.springframework.kafka.core.DefaultKafkaConsumerFactory">
26         <constructor-arg>
27             <ref bean="consumerProperties"/>
28         </constructor-arg>
29     </bean>
30
31     <!-- 消费消息的服务类 -->
32     <bean id="messageListernerConsumerService" class="com.zhaopin.consumer.ConsumerService"/>
33
34     <!-- 消费者容器配置信息 -->
35     <bean id="containerProperties" class="org.springframework.kafka.listener.config.ContainerProperties">
36         <constructor-arg value="friend"/>
37         <!--<constructor-arg>
38             <list>
39                 <value>zptopic</value>
40                 <value>ssmk</value>
41                 <value>friend</value>
42             </list>
43         </constructor-arg>-->
44         <property name="messageListener" ref="messageListernerConsumerService"/>
45
46         <!-- 设置如何提交offset -->
47         <property name="ackMode" value="MANUAL_IMMEDIATE"/>
48     </bean>
49
50     <!-- 单线程消息监听容器 -->
51     <!--<bean id="messageListenerContainer" class="org.springframework.kafka.listener.KafkaMessageListenerContainer" init-method="doStart">
52         <constructor-arg ref="consumerFactory"/>
53         <constructor-arg ref="containerProperties"/>
54     </bean>-->
55
56     <!-- 多线程消息监听容器 -->
57     <bean id="messageListenerContainer" class="org.springframework.kafka.listener.ConcurrentMessageListenerContainer" init-method="doStart">
58         <constructor-arg ref="consumerFactory"/>
59         <constructor-arg ref="containerProperties"/>
60         <property name="concurrency" value="5"/>
61     </bean>
62
63 </beans>


消费者监听类实现AcknowledgingMessageListener这个监听器,可以实现手动提交offset:

package com.zhaopin.consumer;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.zhaopin.consumer.dto.FriendRelationDto;
import com.zhaopin.consumer.dto.MessageDto;
import com.zhaopin.consumer.service.FriendRelationService;
import com.zhaopin.pojo.TbPerson;
import com.zhaopin.service.PersonService;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.listener.AcknowledgingMessageListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
* Created by SYJ on 2017/3/21.
*/
@Service
public class ConsumerService implements AcknowledgingMessageListener<Integer, String> {

private static final Logger logger = LoggerFactory.getLogger(ConsumerService.class);
private static List<TbPerson> personList = new ArrayList<TbPerson>();
private static final Integer INSERT_BATCH_COUNT = 50;

@Autowired
private PersonService personService;

@Autowired
private FriendRelationService friendRelationService;

/**
* 消息监听方法
* @param record
*/
/*@Override
public void onMessage(ConsumerRecord<Integer, String> record) {
logger.info("Before receiving:" + record.toString());
String value = record.value();
MessageDto<FriendRelationDto> message = JSON.parseObject(value, new TypeReference<MessageDto<FriendRelationDto>>(){});
try {
friendRelationService.process(message.getData());
} catch (IOException e) {
e.printStackTrace();
}
//insert(record);
//insertBatch(record);
}*/

/**
* 单个TbPerson入库
* @param record
*/
public void insert(ConsumerRecord<Integer, String> record){
String value = record.value();
TbPerson person = JSON.parseObject(value, TbPerson.class);
personService.insert(person);
System.out.println("Single data writing to the database:" + record);
}

/**
* 批量TbPerson入库
* @param record
*/
public void insertBatch(ConsumerRecord<Integer, String> record){
String value = record.value();
TbPerson person = JSON.parseObject(value, TbPerson.class);
personList.add(person);
if (personList.size() == INSERT_BATCH_COUNT) {
personService.insertBatch(personList);
System.out.println("Batch data writing to the database:" + personList);
personList.clear();
}
}

@Override
public void onMessage(ConsumerRecord<Integer, String> record, Acknowledgment acknowledgment) {
logger.info("Before receiving:" + record.toString());
String value = record.value();
MessageDto<FriendRelationDto> message = JSON.parseObject(value, new TypeReference<MessageDto<FriendRelationDto>>(){});
try {
friendRelationService.process(message.getData());
acknowledgment.acknowledge();//提交offset
} catch (IOException e) {
e.printStackTrace();
}
//insert(record);
//insertBatch(record);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: