記一次思維定勢造成的問題,關於"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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章