记一次思维定势造成的问题,关于"SpringBoot是否可以不再后台运行"问题及思考

接到一个任务,是写一个csv文档中的数据存入到数据库中,用了SpringBoot集成MyBatis来完成,写的倒是很顺利,一天多就写好了。

但是后来领导说要放在服务器上定时跑这个功能。

最近做的放在服务器上运行的项目,无论是普通项目还是Maven项目,都是先生成jar包,再使用Linux的crontab,使用Java命令的方式来完成的。这样的方式需要指定一个主类,该类下有一个Main方法,通过调用这个Main方法来执行方法中的功能。我在测试写入数据库的功能时候用到的是SpringBoot的单元测试,测试阶段就是执行的功能运行一次就完了,这好像很适合做Main类,但是SpringBoot的测试类却是不适合作为主类的。要是按照SpringBoot的方式运行,我又该把定时运行的主类放在哪呢?即使是写一个主类,只运行主类就不能使用Spring的功能了啊,而要运行SpringBoot的默认入口类则会将整个项目都在后台运行,而不是运行一次。这么想我产生了苦恼,难道我不该用SpringBoot的方式写这个项目?而应该使用最原始的Spring方式?那再集成MyBatis我还要再编写SQLSessionFactory什么的不成?那样的话就真的是太麻烦了!而如果不使用最原始的方式,我要怎么写只执行一次的主类呢?这项目也没用到Controller,我也没办法通过访问某个网络地址来启动功能啊!

就这样我想入了死胡同里,被这个问题困扰了将近一天的时间,差点就真的要改成最原始也最复杂的方式了!

直到后来,跟旁边同事说起这个事,说SpringBoot是Web项目,会一直运行在后台,而不是只运行一次。说话间,我想到了SpringBoot本身就是可以使用定时任务的啊!我为什么要把它改成只运行一次?为什么不能用SpringBoot的定时任务做呢?

就这一瞬间,思路被打开了,用了一分钟写了一个SpringBoot的定时任务类,运行一下,Spring的相关组件都能完美调用,我想要实现的功能也实现了。

其实以前做定时任务时都是用的项目里的定时器,直到最近才用了Linux的crontab定时器,没想到这段时间的使用居然让我陷入了写定时功能就只能写一个只运行一次功能,而不应该运行在后台的误区,甚至觉得SpringBoot不能设置只运行一次是有一点不人性化的。

由此我想到,很多时候,在熟悉了某种思维时人们总容易陷入这种思维的定势,不论做什么总向着这个定势靠,别的不满足这个定势的好像都不正确了。但是当有了另外一种思维突然闯入的时候,会发现原来自己真的是想错了!

而新思维方式是要依靠新知识作为基础的,如果我不知道SpringBoot有定时器的功能,我也就不会想到写SpringBoot的定时器来解决这个问题了。所以,为了不轻易陷入某种思维定势,还是要多学习啊!


补充,其实后来发现还是真有方法使得SpringBoot项目只运行一次的!
贴上代码

@SpringBootApplication
public class MyApplication {
	public static Logger logger = LoggerFactory.getLogger(MyApplication.class);

	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class, args);
		//获取处理业务的Bean
		MyBean MyBean=context.getBean(Bean.class);
		mybean.doSomeThing();
		context.close();
	}

}
发布了50 篇原创文章 · 获赞 37 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章