前言
这段时间在做一个内部sql转换中间件项目.涉及到从kafka取消息.网上的简单样例大多是单线程的自动获取提交样例.在这里我需要手动提交消息.
maven
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.11.0.0</version>
</dependency>
单线程
@Component("kafkaUtils")
public class KafkaUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(KafkaUtils.class);
private KafkaConsumer<String, String> consumer;//消费者
@Value("${kafka.consumer.servers}")
private String server;
@Value("${kafka.consumer.group.id}")
private String groupId;
@Value("${kafka.consumer.topic}")
private String topic;
public static long receiveMsgMill = 0L;//从kafka获取消息的最新时间戳
@PostConstruct
public void init() {
Properties props = new Properties();
props.put("bootstrap.servers", server);// 服务器ip:端口号,集群用逗号分隔
props.put("group.id", groupId);
props.put("enable.auto.commit", "false");
//props.put("auto.commit.interval.ms", "5000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("auto.offset.reset", "earliest");
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe((Arrays.asList(topic)));
}
public KafkaConsumer<String, String> getKafkaConsumer() {
return consumer;
}
@PreDestroy
public void closeKafkaConsumer() {
consumer.close();
}
/**
* 从kafka上接收对象消息,将json字符串转化为对象,便于获取消息的时候可以使用get方法获取。
*
* @param count
* 获取的消息个数
* @return 获取的消息队列
*/
public List<JSONObject> getMsgFromKafka(int count) {
List<JSONObject> list = new LinkedList<>();
try {
boolean getDataFlag = f