如何在spring 集成kafka?

如何使用spring集成kafka?

因在公司的JAVA Web项目中要使用kafka作为消息队列,加之spring集成了kafka,就希望直接调用spring 集成的,未采用原生态的kafka。

1.pom依赖项

        
            org.springframework.kafka
            spring-kafka
            1.1.0.RELEASE
        
       
        org.springframework.integration
        spring-integration-kafka
        2.1.0.RELEASE
        
            
                log4j
                log4j
            
        
       
        
            org.apache.kafka
            kafka-clients
            0.10.0.0
        

2.Producer配置详解

 
    
        
            
            
            
            
            
            
        
    



    
        
    



    
    

2使用生产者

    @Autowired
    private KafkaTemplate kafkaTemplate;
    kafkaTemplate.send("testTopic", "helloWorld");

3Consumer配置


    
        
            
            
            
            
            
        
    




    
        
    


 


 

    
        
            cn.touna.mkdir.user.logs
            scheduler.svn.update
            scheduler.kill.job
        
    
    




    
    

4使用消费者

public class KafkaMessageListener implements MessageListener<String, String> {

    private static Logger LOG = LoggerFactory.getLogger(KafkaMessageListener.class);
    @Autowired
    private AppProperties appProperties;

    @Override
    public void onMessage(ConsumerRecord data) {
        LOG.info("消费消息topic:{} value {}", data.topic(), data.value());
        String topic = data.topic();
        String content = data.value();
        //可同时监听多个topic,根据不同topic处理不同的业务
        if (topic.equals("topica")) {           
            LOG.info("###############topic:{} value:{}" ,topic,content);
        } else if (topic.equals("topicb")) {
         LOG.info("###############topic:{} value:{}" ,topic,content);
        } 
    }
}

5遇到的问题
报错: KafkaConsumer is not safe for multi-threaded access
当多线程同事用一个consumer去消费的时候,就会报出这个异常。查找原因,有定时任务,会在线程池中定时启用线程,去用同一个consumer消费kafka的消息。
解决方案:
1每一个线程都新建一个consumer消费,不会报这个异常,但是因为每一个consumer都会在默认分组里面,由于kafka的消费机制是同一个partition的消息只能被group内一个consumer消费,那么造成只有一个consumer消费得都消息,那么我的定时任务就没意义了。
2加锁

    private Lock lock = new ReentrantLock();
                    try{
                    lock.lock();

                    ToDO...
                    }catch(Exception e){
                    e.printStackTrace();
                    }finally {
                    lock.unlock();
                  }

6自己的疑问
这种spring集成kafka消费都是这种监听机制,如果我不希望采用监听的方式,我希望什么时候需要的时候什么时候去取kafka的消息,改如何实现,查了些资料没找到。但是通过源代码,发现有DefaultKafkaConsumerFactory这个类里面有createConsumer方法,所以尝试用这个类去创建consumer消费消息,但是试了很多次没消费成功,最后还是用的原生态的写法写的消费者
###

ApplicationContext context=new ClassPathXmlApplicationContext("kafka-consumer.xml");
        consumerFactory=(DefaultKafkaConsumerFactory)context.getBean("consumerFactory");
        List topicList = new ArrayList<>();
        topicList.add("topic2");
        consumer= (KafkaConsumer)consumerFactory.createConsumer();
        consumer.subscribe(topicList);
        //消费者的配置文件总配置了每次最多消费一条消息
        ConsumerRecords records = consumer.poll(1000);
        for (ConsumerRecord record : records) {
          System.out.println("factory"+record.topic()+record.value());

        }
        consumer.commitSync();

你可能感兴趣的:(Kafka)