kafka-java客户端连接
使用java客户端, kafkaproducer, kafkaconsumer进行kafka的连接
注: 0.10 版本之后, 连接kafka只需要brokerip即可, 不需要zookeeper的信息
1, kafka 配置信息
{
"producer": {
"bootstrap.servers": "10.183.93.127:9093,10.183.93.128:9093,10.183.93.130:9093",
"key.serializer": "org.apache.kafka.common.serialization.StringSerializer",
"value.serializer": "org.apache.kafka.common.serialization.StringSerializer",
"max.request.size": "",
"batch.size": "",
"buffer.memory": "",
"max.block.ms": "",
"retries": "",
"acks": "",
},
"cosumer": {
"bootstrap.servers": "10.183.93.127:9093,10.183.93.128:9093,10.183.93.130:9093",
"group.id": "test222",
"session.timeout.ms": "",
"key.deserializer": "org.apache.kafka.common.serialization.StringDeserializer",
"value.deserializer": "org.apache.kafka.common.serialization.StringDeserializer"
}
}
2, kafka utils, 用来读取kafka的配置信息
package com.wenbronk.kafka; import com.alibaba.fastjson.JSON;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.junit.Test; import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Map;
import java.util.Properties; public class KafkaUtils {
@Test
public void test() throws FileNotFoundException {
getConfig("producer");
// fastJSON();
} public static JsonObject getConfig(String name) throws FileNotFoundException {
JsonParser parser = new JsonParser();
JsonElement parse = parser.parse(new FileReader("src/main/resources/kafka"));
JsonObject jsonObject = parse.getAsJsonObject().getAsJsonObject(name);
System.out.println(jsonObject);
return jsonObject;
} public static Properties getProperties(String sourceName) throws FileNotFoundException {
JsonObject config = KafkaUtils.getConfig(sourceName);
Properties properties = new Properties(); for (Map.Entry<String, JsonElement> entry : config.entrySet()) {
properties.put(entry.getKey(), entry.getValue().getAsString());
}
return properties;
} // public static void fastJSON() throws FileNotFoundException {
// Object o = JSON.toJSON(new FileReader("src/main/resources/kafka"));
// System.out.println(o);
// } }
3, kafka producer
package com.wenbronk.kafka; import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.junit.Test; import javax.swing.text.StyledEditorKit;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.stream.IntStream; /**
* 消息提供者
*/
public class KafkaProducerMain { @Test
public void send() throws Exception {
HashMap<String, String> map = new HashMap<>();
map.put("http_zhixin", "send message to kafka from producer");
for (int i = ; i < ; i++ ) {
sendMessage(map);
}
// sendMessage(map);
} /**
* 消息发送
*/
public void sendMessage(Map<String, String> topicMsg) throws FileNotFoundException {
Properties properties = KafkaUtils.getProperties("producer");
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties); for (Map.Entry<String, String> entry : topicMsg.entrySet()) {
String topic = entry.getKey();
String message = entry.getValue();
ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, message);
// 发送
// producer.send(record, new CallBackFuntion(topic, message));
producer.send(record, (recordMetadata, e) -> {
if (e != null) {
System.err.println(topic + ": " + message + "--消息发送失败");
}else {
System.err.println(topic + ": " + message + "--消息发送成功");
}
});
}
producer.flush();
producer.close();
}
}
回掉函数可写匿名内部类, 也可写外部类通过新建的方式运行
package com.wenbronk.kafka; import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.RecordMetadata; /**
* 回掉函数
*/
public class CallBackFuntion implements Callback { private String topic;
private String message; public CallBackFuntion(String topic, String message) {
this.topic = topic;
this.message = message;
} @Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e != null) {
System.out.println(topic + ": " + message + "--消息发送失败");
}else {
System.out.println(topic + ": " + message + "--消息发送成功");
}
}
}
4, kafka consumer
package com.wenbronk.kafka; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.OffsetAndMetadata;
import org.apache.kafka.common.TopicPartition;
import org.junit.Test; import java.io.FileNotFoundException;
import java.util.*; public class KafkaConsumerMain { /**
* 自动提交offset
*/
public void commitAuto(List<String> topics) throws FileNotFoundException {
Properties props = KafkaUtils.getProperties("cosumer");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", ""); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(topics);
while (true) {
ConsumerRecords<String, String> records = consumer.poll();
for (ConsumerRecord<String, String> record : records)
System.err.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
} /**
* 手动提交offset
*
* @throws FileNotFoundException
*/
public void commitControl(List<String> topics) throws FileNotFoundException {
Properties props = KafkaUtils.getProperties("cosumer");
props.put("enable.auto.commit", "false"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(topics);
final int minBatchSize = ;
List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
while (true) {
ConsumerRecords<String, String> records = consumer.poll();
for (ConsumerRecord<String, String> record : records) {
buffer.add(record);
}
if (buffer.size() >= minBatchSize) {
insertIntoDb(buffer);
// 阻塞同步提交
consumer.commitSync();
buffer.clear();
}
}
} /**
* 手动设置分区
*/
public void setOffSet(List<String> topics) throws FileNotFoundException {
Properties props = KafkaUtils.getProperties("cosumer");
props.put("enable.auto.commit", "false"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(topics); while (true) {
ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);
// 处理每个分区消息后, 提交偏移量
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition); for (ConsumerRecord<String, String> record : partitionRecords) {
System.out.println(record.offset() + ": " + record.value());
}
long lastOffset = partitionRecords.get(partitionRecords.size() - ).offset();
consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + )));
}
}
} /**
* 手动设置消息offset
*/
public void setSeek(List<String> topics) throws FileNotFoundException {
Properties props = KafkaUtils.getProperties("cosumer");
props.put("enable.auto.commit", "false"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(topics);
consumer.seek(new TopicPartition("http_zhixin", ), );
ConsumerRecords<String, String> records = consumer.poll(); for (ConsumerRecord<String, String> record : records) {
System.err.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
consumer.commitSync();
} } @Test
public void test() throws FileNotFoundException {
ArrayList<String> topics = new ArrayList<>();
topics.add("http_zhixin"); // commitAuto(topics);
// commitControl(topics);
// setOffSet(topics);
setSeek(topics);
} /**
* doSomethings
*/
private void insertIntoDb(List<ConsumerRecord<String, String>> buffer) {
buffer.stream().map(x -> x.value()).forEach(System.err::println);
} }
kafka 处于同一组的消费者, 不可以重复读取消息, 0.11版本中加入了事物控制
kafka-java客户端连接的更多相关文章
- 【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接
在CentOS安装 因Rabbit MQ使用Erlang,所以需要先安装Erlang,安装过程中可能会遇到种种问题,可参考CentOS 6.5安装Erlang/OTP 17.0.然后就可以安装MQ了. ...
- Elasticsearch - java客户端连接
写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 最简单的在java客户端连 ...
- 通过java客户端连接hbase 注意事项
1.通过Java客户端连接Hbase,其中hbase通过zookeeper去管理,需要注意的是客户端端口. 通过在浏览器端输入地址查看:http://192.168.3.206:60010/maste ...
- Zookeeper学习记录及Java客户端连接示例
1. Zookeeper 1.1 简介 ZooKeeper is a centralized service for maintaining configuration information, na ...
- Java客户端连接kafka集群报错
往kafka集群发送消息时,报错如下: page_visits-1: 30005 ms has passed since batch creation plus linger time 加入log4j ...
- 关于Java客户端连接虚拟机中的Kafka时,无法发送、接收消息的问题
kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案? 1.问题排查 (1)首先通过在服务器上使用命令行来模拟生产.消费数据,发现 ...
- RabbitMQ/JAVA 客户端连接测试
这里是一个简单的helloworld测试. 这里在eclipse平台中实现 细节不再赘述.重点是导入rabbitmq-java-client的jar包 下载地址:http://www.rabbitmq ...
- java客户端连接MongoDB数据库的简单使用
1.下载mongoDB的jar包,并引入到工程的CLASSPATH中下载:mongodb2.5驱动包下载 如果使用maven项目,最新的依赖如下: <dependency> <gro ...
- java socket通讯(二)处理多个客户端连接
通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...
- Java操作ElasticSearch之创建客户端连接
Java操作ElasticSearch之创建客户端连接 3 发布时间:『 2017-09-11 17:02』 博客类别:elasticsearch 阅读(3157) Java操作ElasticSe ...
随机推荐
- DeepFace和GAN
由于换脸技术的影响,现在造假视频的成本越来越低.AI换脸视频也越来越热门,甚至有一些已经达到了以假乱真的程度.虽然有明星反对表示无奈,可是.... 据报道,2018年,arXiv上发布了902篇GAN ...
- java基础-day11
第11天 综合练习 今日内容介绍 u 综合练习 第1章 综合练习 1.1 综合练习一 A:键盘录入3个学生信息(学号,姓名,年龄,居住地)存入集合,要求学生信息的学号不能重复 B:遍历集 ...
- spring的bean在什么时候被实例化
Spring什么时候实例化bean,首先要分2种情况 第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化 第二:如 ...
- 6、GNU makefile工程管理学习的一个例子
在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...
- [正则表达式] PHP 中使用正则表达式收集(2016/01/08 - )
// 1. 过滤字符串中src 属性为空的img 标签 $filterBack = preg_replace("/<img[^<>]*src\=[\'\"][\' ...
- poj2828 线段树单点更新
Buy Tickets Time Limit: 4000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- 使用EF操作Oracle数据库小计
1.建表 CREATE TABLE item.ORDERS( ORDERID ) CONSTRAINT PK_ORDERS PRIMARY KEY, ORDERNO ), STOREID ), STO ...
- Python 中的深拷贝和浅拷贝
一.浅拷贝python中 对象赋值时 默认是浅拷贝,满足如下规律:1. 对于 不可变对象(字符串,元组 等),赋值 实际上是创建一个新的对象:例如: >>> person=['nam ...
- await和async在C#一般处理程序(ashx)中的使用
public class hello : HttpTaskAsyncHandler, IReadOnlySessionState { public IFetchServise fetch { get; ...
- Windows核心编程:第2章 字符和字符串处理
Github https://github.com/gongluck/Windows-Core-Program.git //第2章 字符和字符串处理.cpp: 定义应用程序的入口点. // #incl ...