kafka使用实例
定义一个procucer
package cn.vko.common.kafka; import java.util.Properties; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import cn.vko.common.utils.mybatis.GenCreateInterceptor; import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig; public class VkoProducer {
// private Logger log = LoggerFactory.getLogger(VkoProducer.class);
private String metadataBrokerList;
private Producer<String, String> producer; public VkoProducer(String metadataBrokerList) {
super();
if(StringUtils.isEmpty(metadataBrokerList)){
String message = "metadataBrokerList 不可以为空";
// log.error(message);
throw new RuntimeException(message);
}
this.metadataBrokerList = metadataBrokerList;
// 设置配置属性
Properties props = new Properties();
props.put("metadata.broker.list", metadataBrokerList);
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("key.serializer.class", "kafka.serializer.StringEncoder");
props.put("request.required.acks", "1");
//props.put("producer.type", "async");
props.put("queue.buffering.max.ms", "5000");
props.put("queue.buffering.max.messages", "30000");
props.put("queue.enqueue.timeout.ms", "-1");
props.put("batch.num.messages", "1");
// 可选配置,如果不配置,则使用默认的partitioner
//props.put("partitioner.class", "cn.vko.kafka.PartitionerDemo");
// 触发acknowledgement机制,否则是fire and forget,可能会引起数据丢失
// 值为0,1,-1,可以参考
// http://kafka.apache.org/08/configuration.html
ProducerConfig config = new ProducerConfig(props);
producer = new Producer<String, String>(config);
} /**
* 单条插入队列
* @param msg
* @param topic 主题
* @return
*/
public String send(String topic, String msg) {
// Long start = System.currentTimeMillis();
KeyedMessage<String, String> data = new KeyedMessage<String, String>(topic, msg);
producer.send(data);
// log.info("发送消息耗时:{}",System.currentTimeMillis()- start);
return "ok";
}
}
定义一个receiver
package cn.vko.common.kafka; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import cn.vko.common.utils.mybatis.GenCreateInterceptor;
import cn.vko.component.pageframework.util.StringUtil; import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector; public class Receiver {
private Logger log = LoggerFactory.getLogger(Receiver.class);
private String zookeeperConnect;
private String groupId;
private String topic;
private VkoConsumer vkoConsumer; /**
* 创建收件人
* @param zookeeperConnect zk集群地址,逗号分隔
* @param groupId 组id
* @param topic 主题
* @param vkoConsumer 处理器
*/
public Receiver(String zookeeperConnect, String groupId, String topic,VkoConsumer vkoConsumer) {
super();
if(StringUtil.isEmpty(zookeeperConnect)){
String message = "zookeeperConnect 不可以为空";
log.error(message);
throw new RuntimeException(message);
}
if(StringUtil.isEmpty(groupId)){
String message = "groupId 不可以为空";
log.error(message);
throw new RuntimeException(message);
}
if(StringUtil.isEmpty(topic)){
String message = "topic 不可以为空";
log.error(message);
throw new RuntimeException(message);
}
if(vkoConsumer == null){
String message = "vkoConsumer 不可以为空";
log.error(message);
throw new RuntimeException(message);
}
this.zookeeperConnect = zookeeperConnect;
this.groupId = groupId;
this.topic = topic;
this.vkoConsumer = vkoConsumer;
log.info("kafka vkoConsumer 创建完成:groupId:{},topic:{},zookeeperConnect:{}",groupId, topic, zookeeperConnect);
receive();
} private void receive(){
Properties props = new Properties();
props.put("zookeeper.connect", zookeeperConnect);
props.put("group.id", groupId);
props.put("zookeeper.session.timeout.ms", "14000");
props.put("zookeeper.sync.time.ms", "200");
props.put("auto.commit.interval.ms", "1000");
ConsumerConfig conf = new ConsumerConfig(props);
ConsumerConnector cc = Consumer.createJavaConsumerConnector(conf);
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
// 目前每个topic都是2个分区
topicCountMap.put(topic,2);
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = cc.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
for (final KafkaStream<byte[], byte[]> stream : streams) {
new Thread(){
public void run(){
ConsumerIterator<byte[], byte[]> it = stream.iterator();
while(it.hasNext()){
String msg = new String(it.next().message());
try{
vkoConsumer.dealMsg(msg);
}catch(Exception e){
log.error("kafka vkoConsumer topic:{} 收到消息:{} 消费异常 xxxxxxxxxxxxxxxxxx", topic, msg,e);
}
log.info("kafka vkoConsumer topic:{} 收到消息:{}", topic, msg);
}
}
}.start();
log.info("kafka vkoConsumer 启动完成:groupId:{},topic:{},zookeeperConnect:{}",groupId, topic, zookeeperConnect);
}
log.info("kafka vkoConsumer 准备接收消息:groupId:{},topic:{},zookeeperConnect:{}",groupId, topic, zookeeperConnect);
}
}
package cn.vko.common.kafka;
public interface VkoConsumer {
public void dealMsg(String strings);
}
在需要consumer的程序中定义一个消费实现类,并注入到receiver中,这样spring容器启动时会自动创建一个receiver,进行对特定的topic消费
<!-- 定义消息处理器 -->
<bean id="sellStatConsumer" class="cn.vko.sell.kafka.consumer.SellStatConsumer" ></bean> <!-- 定义收信人 receiver -->
<bean id="sellStatReceiver" class="cn.vko.common.kafka.Receiver"> <constructor-arg index="0" value="${zookeeper.connect}" /><!-- _zookeeper集群地址,如: zkserver1.vko.cn:2181,zkserver2.vko.cn:2181,zkserver3.vko.cn:2181_--> <constructor-arg index="1" value="${sellstat.group.id}" /><!-- _消费者所属组id字符串 ,如:vko_group_article_read_count_--> <constructor-arg index="2" value="${kafka.sellstat.topics}"/><!-- _要消费的消息主题,如:vko_group_--> <constructor-arg index="3" ref="sellStatConsumer" /> <!--_上面定义的消息处理器_-->
</bean>
kafka使用实例的更多相关文章
- 【运维技术】kafka三实例集群环境搭建及测试使用
kafka三实例集群环境搭建及测试使用 单机搭建分为两部分:1. 软件安装启动 2. 软件配置 软件安装启动: # 切换到目录 cd /app # 获取kafka最新安装包,这边使用的是镜像地址,可以 ...
- .net core kafka 入门实例 一篇看懂
kafka 相信都有听说过,不管有没有用过,在江湖上可以说是大名鼎鼎,就像天龙八部里的乔峰.国际惯例,先介绍生平事迹 简介 Kafka 是由 Apache软件基金会 开发的一个开源流处理平台, ...
- springboot + kafka 入门实例 入门demo
springboot + kafka 入门实例 入门demo 版本说明 springboot版本:2.3.3.RELEASE kakfa服务端版本:kafka_2.12-2.6.0.tgz zooke ...
- Go语言学习之12 etcd、contex、kafka消费实例、logagent
本节内容: 1. etcd介绍与使用 2. ElastcSearch介绍与使用 1. etcd介绍与使用 概念:高可用的分布式key-value存储,可以使用配置共享和服务发现 ...
- kafka producer实例
1. 定义要发送的消息User POJO package lenmom.kafkaproducer; public class User { public String name; public in ...
- kafka java实例
生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...
- 《OD大数据实战》Kafka入门实例
官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...
- Kafka系列之-Kafka Protocol实例分析
本文基于A Guide To The Kafka Protocol文档,以及Spark Streaming中实现的org.apache.spark.streaming.kafka.KafkaClust ...
- Kafka性能测试实例
1.概述 在分布式实时数据流场景下,随着数据量的增长,对Kafka集群的性能和稳定性的要求也很高.本篇博客将从生产者和消费者两方面来做性能测试,针对具体的业务和数据量,来调优Kafka集群. 2.内容 ...
随机推荐
- 2013~2014年度 NOIP~GDOI总结
滚回去撸一年中考撸完之后就迎来了NOIP2013(话说初赛差点被坑了有木有= =)想想当年10月还是那样的天真的去了广州,结果就被虐成翔的回来了= =只做了三道签到题的渣渣就是弱= =DAY1T2死活 ...
- java常见文件操作
收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if ( ...
- 【排序算法】希尔排序算法 Java实现
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...
- hibernate动态切换数据源
起因: 公司的当前产品,主要是两个项目集成的,一个是java项目,还有一个是php项目,两个项目用的是不同的数据源,但都是mysql数据库,因为java这边的开发工作已经基本完成了,而php那边任务还 ...
- php 实现简单购物车
今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...
- C#集合的应用以及和数组比较,它的好处有哪些
我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...
- Memcached·Redis缓存的基本操作
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- HTML&CSS Table元素详细解说
1.预热 css样式多如牛毛,我不可能一个一个去讲,那样好像背字典一样,我相信你们也不喜欢这样的方式.所以,我会在实战中慢慢和你讲解,然后,你记住一些重要的css属性就可以了.关键是,你要学会去查资料 ...
- 1754: [Usaco2005 qua]Bull Math
1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 398 Solved: 242[Submit ...
- JAVA面试题和答案
本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...