storm和spring的结合

1 软件版本 storm0.10 +spring 4.36,网上的例子很少经过摸索除了sport和bolt无法注入其他类都可以了

2 类似于springmvc的结构,bolt  service  dao

3 因为bolt是由 nimbus 端实例化然后通过序列化传输 到supervisor再反向序列化, 所以bolt和sport无法通过spring注入

4 SpringBeanutil 类的加载工具

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringBeanutil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;
    
    
    
    
    @Override
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        applicationContext=arg0;
        
    }
    
    public static <T> T getBean(String name,Class<T> clazz){
        if (applicationContext==null){
            SpringContext.SpringContextInit();
        }
        
        return applicationContext.getBean(name,clazz);
    }
    
    

}


5 spring加载SpringContext

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public  class  SpringContext {
    
    private static ApplicationContext applicationContext ;

    
    public static synchronized  void SpringContextInit(){
        if (applicationContext==null){
             applicationContext =new ClassPathXmlApplicationContext("spring-demo2.xml");
             // applicationContext =new ClassPathXmlApplicationContext("spring-hbase.xml");
        }
        
          
    }

   


6 在bolt的 prepare 中调用对service进行实例化,需要继承BaseRichBolt




public class LoadBolt extends BaseRichBolt {
    
    /**
     *
     */
    private static final long serialVersionUID = 6084084850932212408L;
    Logger log = LoggerFactory.getLogger(LoadBolt.class);
    private LoadService service ;
    private OutputCollector collector;
    /**
     * 业务处理
     */
    public void execute(Tuple input) {
        
        service.execute(input, collector);
        
        
        
    }

    //申明了输出tuple的key是data
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
         declarer.declare(new Fields("line"));
        
    }

    @Override
    public void prepare(Map map, TopologyContext context, OutputCollector collector) {
        this.collector=collector;
        service=SpringBeanutil.getBean("loadService", LoadService.class);
    }
    
    


}

    
    
}

7 service中就实现自己的业务逻辑,应该就是和springmvc一样  不过要记得执行collector.ack(input);

经过测试aop功能,类的注入可以顺利使用,不过我使用fatjar来打包的药注意对spring 配置文件的合并,不然会报错,

还有要注意原先在bolt中使用的一些对象放在service中了,要注意有很多类不支持多线程并发操作


service接口


package com.nari.demo2.service;

import backtype.storm.task.OutputCollector;
import backtype.storm.tuple.Tuple;
import org.slf4j.Logger;
public interface BoltService {

    String getName();
    
    void execute(Tuple input ,OutputCollector collector) ;
    
    Logger getLog();
}


猜你喜欢

转载自blog.csdn.net/swcj/article/details/54584962