首页 > 技术文章 > storm和springboot结合

yjcblog 2018-08-07 16:12 原文

springboot作为这几年流行的java框架,以其简易的开发风格,受到了很多人的关注。最近有个项目需要用到storm,就想着结合springboot进行开发。中间遇到几个问题,鉴于网上很多相关的博客都是复制粘贴的,远程提交拓扑会有问题,我这里简单列下我的做法:

问题1: storm的每个拓扑都需要一个程序执行的入口,而springboot只有一个入口,两者有冲突

解决方案:在springboot启动的main方法里,通过命令行传进的参数,取到不同的拓扑bean,启动响应的拓扑

 

问题2:storm远程提交的时候,spout和bolt里取不到spring管理的bean

解决方案:在spout的open方法、bolt的prepare方法里,手动取得bean。这里需要手动写个工具类,来获取到spring的上下文,同时需要避免上下文重复加载

如图,我这里使用的是双重检查的机制:

public class SpringContextUtil {

    private static ApplicationContext context;

    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.context = applicationContext;
    }

    public static ApplicationContext getContext(){
        if(context == null){
            synchronized (SpringContextUtil.class){
                if(context == null){
                    context = SpringApplication.run(Main.class);
                }
            }
        }
        return context;
    }
}

问题3:打包后,提交的拓扑无法执行

解决方案:编写gradle任务,将工程依赖的jar包传到storm/extlib目录里,执行gradle jar,打出来的jar包就可以正常提交运行了

推荐阅读