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();
}