<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="consumerProperties" class="java.util.HashMap">
<constructor-arg>
<map>
<entry key="bootstrap.servers" value="${bootstrap.servers}"/>
<!-- 指定消费组名 -->
<entry key="group.id" value="friend-group"/>
<entry key="enable.auto.commit" value="false"/>
<entry key="auto.commit.interval.ms" value="1000"/>
<entry key="session.timeout.ms" value="15000"/>
<entry key="max.poll.records" value="1"/>
<entry key="key.deserializer" value="org.apache.kafka.common.serialization.IntegerDeserializer"/>
<!--<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 id="consumerFactory" class="org.springframework.kafka.core.DefaultKafkaConsumerFactory">
<constructor-arg>
<ref bean="consumerProperties"/>
</constructor-arg>
</bean> <!-- 消费消息的服务类 -->
<bean id="messageListernerConsumerService" class="com.zhaopin.consumer.ConsumerService"/> <!-- 消费者容器配置信息 -->
<bean id="containerProperties" class="org.springframework.kafka.listener.config.ContainerProperties">
<constructor-arg value="friend"/>
<!--<constructor-arg>
<list>
<value>zptopic</value>
<value>ssmk</value>
<value>friend</value>
</list>
</constructor-arg>-->
<property name="messageListener" ref="messageListernerConsumerService"/> <!-- 设置如何提交offset -->
<property name="ackMode" value="MANUAL_IMMEDIATE"/>
</bean> <!-- 单线程消息监听容器 -->
<!--<bean id="messageListenerContainer" class="org.springframework.kafka.listener.KafkaMessageListenerContainer" init-method="doStart">
<constructor-arg ref="consumerFactory"/>
<constructor-arg ref="containerProperties"/>
</bean>--> <!-- 多线程消息监听容器 -->
<bean id="messageListenerContainer" class="org.springframework.kafka.listener.ConcurrentMessageListenerContainer" init-method="doStart">
<constructor-arg ref="consumerFactory"/>
<constructor-arg ref="containerProperties"/>
<property name="concurrency" value="5"/>
</bean> </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);
}
}

spring-kafka手动提交offset的更多相关文章

  1. 关于SpringKafka消费者的几个监听器:[一次处理单条消息和一次处理一批消息]以及[自动提交offset和手动提交offset]

    自己在使用Spring Kafka 的消费者消费消息的时候的实践总结: 接口 KafkaDataListener 是spring-kafka提供的一个供消费者接受消息的顶层接口,也是一个空接口; pu ...

  2. Spring-Kafka —— 实现批量消费和手动提交offset

    spring-kafka的官方文档介绍,可以知道自1.1版本之后, @KafkaListener开始支持批量消费,只需要设置batchListener参数为true 把application.yml中 ...

  3. kafka手动设置offset

    项目中经常有需求不是消费kafka队列全部的数据,取区间数据 查询kafka最大的offset: ./kafka-run-class.sh kafka.tools.GetOffsetShell --b ...

  4. Kafka提交offset机制

    在kafka的消费者中,有一个非常关键的机制,那就是offset机制.它使得Kafka在消费的过程中即使挂了或者引发再均衡问题重新分配Partation,当下次重新恢复消费时仍然可以知道从哪里开始消费 ...

  5. Spring-Kafka —— 消费后不提交offset情况的分析总结

    最近在使用kafka,过程中遇到了一些疑问,在查阅了一些资料和相关blog之后,关于手动提交offset的问题,做一下总结和记录. 消费端手动提交offset代码如下: /** * 这是手动提交的消费 ...

  6. Spring Kafka中关于Kafka的配置参数

    #################consumer的配置参数(开始)################# #如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率 ...

  7. kafka多线程消费及处理和手动提交处理方案设计[转]

    转自:http://blog.csdn.net/haoyifen/article/details/54692503 kafka与其他消息队列不同的是, kafka的消费者状态由外部( 消费者本身或者类 ...

  8. kafka消费端提交offset的方式

    Kafka 提供了 3 种提交 offset 的方式 自动提交 复制 1234 consumer.commitSync(); 手动异步提交 offset 复制 1 consumer.commitAsy ...

  9. Kafka消费者手动提交消息偏移

    生产者每次调用poll()方法时,它总是返回由生产者写入Kafka但还没有消费的消息,如果消费者一致处于运行状态,那么分区消息偏移量就没什么用处,但是如果消费者发生崩溃或者有新的消费者加入群组,就会触 ...

随机推荐

  1. h2database轻量级数据库

    h2和derby一样,都是轻量级数据库,h2比derby还要轻巧,核心jar包不到1M.性能效率等等方面都非常好(前提不是高并发,高数据量) 轻量级数据库的应用出其不意,可以完成很多以前常规开发中无法 ...

  2. 10行代码解析krc歌词文件

    互联网上,我们常见的歌词格式有 LRC.TRC(天天动听歌词).KRC(KuGou ResourCe,酷狗资源文件)和 QRC(QQ音乐歌词):在影视制作中,人们通常会用其他的卡拉 OK 字幕格式,例 ...

  3. 解决flume运行中的一个异常问题!

    今天在本地测试flume的exec  监控文件   分割的问题!!!遇到各种141异常问题! 怀疑是在切割文件的时候超过了监控文本的时间,导致flume异常退出,,,所以增加了keep-alive 时 ...

  4. Android面试之HashMap的实现原理

    1.HashMap与HashTable的区别 HashMap允许key和value为null: HashMap是非同步的,线程不安全,也可以通过Collections.synchronizedMap( ...

  5. windbg分析执行在64位环境下的32位程序的dump

    windbg命令例如以下 1.   .load wow64exts 2.   !sw 3.   ~* kvnf

  6. Java 利用 poi 生成 Excel文件的通用例子

    在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 生 ...

  7. Echarts 新认知 地图的label到底怎么居中?

    试过了offset和很多Api,都无法实现label居中 后来无意中发现,原来在geojson注册的时候,可以定义 properties.cp 属性,实现文本的坐标自定义,实现居中. echarts. ...

  8. Python把同一个对象循环赋值给另外一个变量

    Python把同一个对象循环赋值给另外一个变量,修改一个对象,其他对象也修改了 >>> row=['_'] * 3 >>> board = [] >>& ...

  9. java的跳转和重定向,加载显示层

    HttpServltRequest  req,   HttpDervletResponse resp 的 req.sendRedirect('页面');跳转到页面  浏览器地址跳转 --------- ...

  10. Python 3 的安装

    python 3 的安装: 背景: 之前都是在Pychram上写,我的windows下的python版本是3.5,今天要把一个小脚本上到生产环境上. 无奈我服务器上的python版本是2.6.6.所以 ...