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包就可以正常提交运行了