kafka实战

十年热恋 提交于 2021-02-18 08:16:51
----------------------------------------------------------------------------------------------------
applicationContext-resources.xml

<?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-3.0.xsd">

    <!-- load properties -->
    <bean id="propertyConfigurer" class="com.agu3.kafka.base.PropertyConfigurer">
        <property name="locations">
            <list>
                  <value>classpath:/common-kafka.properties</value>
            </list>
        </property>
    </bean>

</beans>


----------------------------------------------------------------------------------------------------
package com.agu3.kafka.base;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

/**
 * 用来读取配置文件
 */
public class PropertyConfigurer extends PropertyPlaceholderConfigurer {

    private static Map<String, String> ctxPropertiesMap = new HashMap<String, String>();

    @Override
    protected void processProperties(
            ConfigurableListableBeanFactory beanFactoryToProcess,Properties props) throws BeansException {
        
        super.processProperties(beanFactoryToProcess, props);
        ctxPropertiesMap = new HashMap<String, String>();
        
        for (Object key : props.keySet()) {
            String keyStr = key.toString();
            String value = props.getProperty(keyStr);
            ctxPropertiesMap.put(keyStr, value);
        }
    }

    public static String getContextProperty(String name) {
        return ctxPropertiesMap.get(name);
    }

}

----------------------------------------------------------------------------------------------------
package com.agu3.kafka.base;

import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

/**
 * kafka配置信息读取
 * @author fenglei.ma
 */
public class KafkaPropertyFactory {
    private static final Logger logger = Logger.getLogger(KafkaPropertyFactory.class);
    
    // 生产者的 后缀key
    public static final String REQUEST_REQUIRED_ACKS = "request.required.acks";
    public static final String METADATA_BROKER_LIST = "metadata.broker.list";
    public static final String SERIALIZER_CLASS = "serializer.class";
    public static final String KEY_SERIALIZER_CLASS = "key.serializer.class";
    public static final String VALUE_SERIALIZER_CLASS = "value.serializer.class";
    
    // 消费者的 后缀key
    public static final String ZOOKEEPER_CONNECT = "zookeeper.connect";
    public static final String GROUP_ID = "group.id";
    public static final String ZOOKEEPER_SESSION_TIMEOUT_MS = "zookeeper.session.timeout.ms";
    public static final String ZOOKEEPER_SYNC_TIME_MS = "zookeeper.sync.time.ms";
    public static final String AUTO_COMMIT_INTERVAL_MS = "auto.commit.interval.ms";
    public static final String AUTO_OFFSET_RESET = "auto.offset.reset";
    
    /**
     * 创建一个kafka消费者的property类
     * 
     * @param kafkaKey
     * @return
     */
    public static Properties getConsumerProperty(String kafkaKey) {
        String[] propertyKeys = new String[]{
                ZOOKEEPER_CONNECT,
                GROUP_ID,
                ZOOKEEPER_SESSION_TIMEOUT_MS,
                ZOOKEEPER_SYNC_TIME_MS,
                AUTO_COMMIT_INTERVAL_MS,
                AUTO_OFFSET_RESET
        };
        
        Properties prop = new Properties();
        for(String propertyKey : propertyKeys) {
            String oneKey = kafkaKey + "." + propertyKey;
            String value = PropertyConfigurer.getContextProperty(oneKey);
            if(StringUtils.isBlank(value)) {
                String msg = "kafka property key not found : " + oneKey;
                logger.error(msg, new Exception(msg));
            }
            prop.put(propertyKey, value);
        }
        return prop;
    }

    /**
     * 创建一个kafka生产者的property类
     * 
     * @param kafkaKey
     * @return
     */
    public static Properties getProductProperty(String kafkaKey) {
        String[] propertyKeys = new String[]{
                REQUEST_REQUIRED_ACKS,
                METADATA_BROKER_LIST,
                SERIALIZER_CLASS,
                KEY_SERIALIZER_CLASS,
                VALUE_SERIALIZER_CLASS
        };
        
        Properties prop = new Properties();
        for(String propertyKey : propertyKeys) {
            String oneKey = kafkaKey + "." + propertyKey;
            String value = PropertyConfigurer.getContextProperty(oneKey);
            if(StringUtils.isBlank(value)) {
                String msg = "kafka property key not found : " + oneKey;
                logger.error(msg, new Exception(msg));
            }
            prop.put(propertyKey, value);
        }
        return prop;
    }

}
----------------------------------------------------------------------------------------------------
package com.agu3.kafka.consumer;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.serializer.Decoder;
import kafka.serializer.StringDecoder;
import kafka.utils.VerifiableProperties;

import com.agu3.kafka.base.KafkaPropertyFactory;

/**
 * kafka消费者
 * 
 * @author fenglei.ma
 */
public class ConsumerAdaptor {
    
    private ConsumerConnector consumer = null;
    private List<ConsumerListener> listeners = new ArrayList<ConsumerListener>();
    
    public ConsumerAdaptor(String key){
        Properties prop = KafkaPropertyFactory.getConsumerProperty(key);
        ConsumerConfig config = new ConsumerConfig(prop);
        consumer = Consumer.createJavaConsumerConnector(config);
        
    }
    
    public void addListener(ConsumerListener listener) {
        listeners.add(listener);
    }
    
    public void start() throws Exception{
        Map<String,Integer> topicCountMap = new HashMap<String,Integer>();
        
        for(int i=0; i<listeners.size(); i++) {
            String topic = listeners.get(i).getTopic();
            topicCountMap.put(topic, i+1);
        }
        
        Decoder<String> keyDecode = new StringDecoder(new VerifiableProperties());
        Decoder<String> valueDecode = new StringDecoder(new VerifiableProperties());
        
        Map<String, List<KafkaStream<String, String>>>  topicStreams = 
                consumer.createMessageStreams(topicCountMap, keyDecode, valueDecode);
        
        List<Thread> threads = new ArrayList<Thread>();
        for(ConsumerListener listener : listeners) {
            String topic = listener.getTopic();
            listener.setStreams(topicStreams.get(topic));
            Thread thread = new Thread(listener);
            thread.start();
            threads.add(thread);
            System.out.println(">>>>>>>>>>> start thread : " + topic);
        }
        
        for(Thread t : threads) {
            t.join();
        }
        
    }
    
    /**
     * 
     */
    public void close(){
        if(consumer != null){
            consumer.shutdown();
        }
    }
    
}

---------------------------------------------------------------------------------

package com.agu3.kafka.consumer;

import java.util.List;

import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.message.MessageAndMetadata;

import org.apache.log4j.Logger;

public class ConsumerListener implements Runnable {
    private static final Logger logger = Logger.getLogger(ConsumerListener.class);
    
    private String topic;
    private List<KafkaStream<String, String>> streams;
    
    public ConsumerListener(String topic){
        this.topic = topic;
    }

    public void run() {
        for(KafkaStream<String, String> stream : streams){
            ConsumerIterator<String, String> it = stream.iterator();
            while(it.hasNext()){
                MessageAndMetadata<String,String> meta = it.next();
                onMessage(meta.topic(),meta.message());
            }
        }
    }
    
    /**
     * 类继承后,可以重写改方法
     * @param topic
     * @param message
     */
    public void onMessage(String topic, String message) {
        logger.info("消费  topic : " + topic + " message: " + message);
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }

    public List<KafkaStream<String, String>> getStreams() {
        return streams;
    }

    public void setStreams(List<KafkaStream<String, String>> streams) {
        this.streams = streams;
    }
    
}

----------------------------------------------------------------------------------------------------
package com.agu3.kafka.producer;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import kafka.producer.ProducerConfig;

import com.agu3.kafka.base.KafkaPropertyFactory;

/**
 *  消息发送
 * 
 * @author fenglei.ma
 */
public class ProducerAdaptor {
    private static Map<String, Properties> propMap = new HashMap<String, Properties>();
    private static Map<String, ProducerSender> producerMap = new HashMap<String, ProducerSender>();;
    
    private static Properties getProperty(String key) {
        Properties properties = propMap.get(key);
        if(properties == null) {
            properties = KafkaPropertyFactory.getProductProperty(key);
            propMap.put(key, properties);
        }
        return properties;
    }
    
    public static ProducerSender getProducer(String key) {
        ProducerSender producer = producerMap.get(key);
        if(producer == null) {
            Properties property = getProperty(key);
            ProducerConfig config = new ProducerConfig(property);
            producer = new ProducerSender(config);
            producerMap.put(key, producer);
        }
        return producer;
    }

}
---------------------------------------------------------------------------------
package com.agu3.kafka.producer;

import org.apache.log4j.Logger;

import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class ProducerSender extends Producer<String, String> {
    private static final Logger logger = Logger.getLogger(ProducerSender.class);

    public ProducerSender(ProducerConfig config) {
        super(config);
    }
    
    public void sendMessage(String topic, String message) {
        logger.info("发送   topic:" + topic + "  message:...");
        send(new KeyedMessage<String, String>(topic, message));
    }

}
----------------------------------------------------------------------------------------------------
package kafka;

import org.apache.log4j.Logger;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author fenglei.ma 2016-09-29
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/spring/applicationContext-resources.xml"})
public class BaseTest {
    public Logger logger = Logger.getLogger(getClass());

}
----------------------------------------------------------------
package kafka;

import org.junit.Test;

import com.agu3.kafka.consumer.ConsumerAdaptor;
import com.agu3.kafka.consumer.ConsumerListener;
import com.agu3.kafka.producer.ProducerAdaptor;
import com.agu3.kafka.producer.ProducerSender;

/**
 * @author fenglei.ma
 */
public class SendTest extends BaseTest{

    @Test
    public void producer() throws Exception {
        ProducerSender producer = ProducerAdaptor.getProducer("kafka_product_hq");
        while (true) {
            try {
                Thread.sleep(1000 * 2);
            } catch (Exception e) {
                e.printStackTrace();
            }
            producer.sendMessage("test_topic_1", "www.baidu.com");
            producer.sendMessage("test_topic_2", "www.google.com");
        }
    }
    
    @Test
    public void consumer() throws Exception {
        try{
            ConsumerAdaptor consumer = new ConsumerAdaptor("kafka_consumer_hq");
            consumer.addListener(new ConsumerListener("test_topic_1"));
            consumer.addListener(new ConsumerListener("test_topic_2"));
            consumer.start();
            System.out.println("aaa");
            
            Thread.sleep(3000);
            
            consumer.close();
            
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
}
----------------------------------------------------------------------------------------------------

common-kafka.properties 配置信息

##生产者
kafka_product_hq.request.required.acks=1
kafka_product_hq.metadata.broker.list=192.168.100.41:9092
kafka_product_hq.serializer.class=kafka.serializer.StringEncoder
kafka_product_hq.key.serializer.class=kafka.serializer.StringEncoder
kafka_product_hq.value.serializer.class=kafka.serializer.StringEncoder

##消费者
kafka_consumer_hq.zookeeper.connect=192.168.100.41:2181,192.168.100.42:2181,192.168.100.43:2181
kafka_consumer_hq.group.id=mytest
kafka_consumer_hq.zookeeper.session.timeout.ms=3000
kafka_consumer_hq.zookeeper.sync.time.ms=200
kafka_consumer_hq.auto.commit.interval.ms=1000
kafka_consumer_hq.auto.offset.reset=smallest


----------------------------------------------------------------------------------------------------
pom.xml 配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


    <modelVersion>4.0.0</modelVersion>
    <groupId>kafka</groupId>
    <artifactId>kafka</artifactId>
    <packaging>war</packaging>
    <version>1.0.0</version>

    <name>kafka-</name>
    <url>http://maven.apache.org</url>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>0.8.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.10</artifactId>
            <version>0.8.2.1</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.2.RELEASE</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>kafka</finalName>
    </build>

</project>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!