摘要:文章鏈接動態腳本支持框架之使用介紹篇動態腳本支持框架之使用介紹篇相關博文動態腳本支持框架整體介紹篇這個項目主要就是為了解決數據訂正和接口驗證不方便的場景,設計的一個及其簡單的動態腳本調度框架,前面一篇整體介紹篇博文,主要介紹了這是
文章鏈接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-動態腳本支持框架之使用介紹篇/
Quick-Task 動態腳本支持框架之使用介紹篇相關博文:
180702-QuickTask動態腳本支持框架整體介紹篇
QuickTask這個項目主要就是為了解決數據訂正和接口驗證不方便的場景,設計的一個及其簡單的動態腳本調度框架,前面一篇整體介紹篇博文,主要介紹了這是個什么東西,整體的運行原理,以及一些簡單的使用demo
本篇博文將主要放在應用場景的探討上,在實際的項目環境中,可以怎么用
I. 框架使用姿勢支目前來說,有兩種簡單的使用方式,一是以獨立的jar包來運行,二是集成在已有的項目中運行;下面分別給出介紹
1. 獨立jar包運行獨立jar包下載,首先下載原始工程,然后打出一個可執行的jar包即可
git clone https://github.com/liuyueyi/quick-task cd quick-task/task-core mvn clean package -Dmaven.test.skip cd target java -jar task-core-0.0.1.jar --task /tmp/script
注意上面的jar包執行中,傳入的--task參數,這個就是制定監聽動態腳本的目錄,如上面的腳本,表示框架會自動加載 /tmp/script 目錄下的Groovy腳本,并執行
當腳本發生變動時,同樣會重新加載更新后的groovy并執行,且會停掉原來的腳本
2. 項目依賴使用作為一個依賴來使用也是可以的,首先是添加pom依賴
yihui-maven-repo https://raw.githubusercontent.com/liuyueyi/maven-repository/master/repository com.git.hui task-core 0.0.1
然后在自己的代碼中,顯示的調用下面一行代碼即可,其中run方法的參數為動態腳本的目錄
new ScriptExecuteEngine().run("/tmp/script");
對于SpringBoot項目而言,可以在入口Application類的run方法中調用,一個demo如下
@SpringBootApplication public class Application implements CommandLineRunner { public static void main(String[] args) throws Exception { SpringApplication app = new SpringApplication(Application.class); app.run(args); } @Override public void run(String... strings) throws Exception { new ScriptExecuteEngine().run("/tmp/script"); } }
對于傳統的Spring項目而言,可以新建一個Listener, 監聽所有的bean初始化完成之后,開始注冊任務引擎,一個可參考的使用case如下
import org.springframework.context.ApplicationEvent; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.SmartApplicationListener; import org.springframework.stereotype.Component; @Component public class RegisterTaskEngineListener implements SmartApplicationListener { @Override public boolean supportsEventType(Class extends ApplicationEvent> aClass) { return aClass == ContextRefreshedEvent.class; } @Override public boolean supportsSourceType(Class> aClass) { return true; } @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { new ScriptExecuteEngine().run("/tmp/script"); } @Override public int getOrder() { return 0; } }3. 對比小結
兩種使用方式,從個人角度出發,并沒有什么優劣之別,主要還是看具體的業務場景,當希望部署一個獨立的任務腳本支持時,可能獨立的部署更加的方便,可以在內部進行資源隔離,減少對線上生產環境的影響;
若是單純的把這個作為一個檢測項目運行的輔助工具時,如回調線上的服務接口,判斷輸出,獲取運行項目中的內部參數等,集成在已有的項目中也是比較簡單的
II. 實際場景演示使用了這個框架,到底有什么用處呢?或者說是否有一些適用的經典case呢?
1. 數據查看這種場景比較常見,但一般配套設施齊全的公司,也不會出現這個問題,我們最常見的查看數據有以下幾類
DB數據查看
緩存數據查看
內存數據查看
對于DB查看,一般沒啥問題,要么可以直連查詢要么就是有查詢工具;而緩存數據的查詢,主要是我們通過序列化后存入的數據,直接從緩存中獲取可能并不太友好;對于運行時內存中的數據,就不太好獲取了,特別是我們使用Guava緩存的數據,如何在項目運行中判斷緩存中的數據是否有問題呢?
一個查看內存的偽代碼
class DemoScript implements ITask { @Override void run() { // 獲取目標對象 xxxBean = ApplicationContextHolder.getBean(xxx.class); xxxBean.getXXX(); } }
上面的腳本中,關鍵就是在于獲取目標對象,拿到目標對象之后,再獲取內部的局部變量或者內存數據就比較簡單了(不能直接訪問的局部變量可以通過反射獲取)
所以關鍵就是獲取目標對象,有下面幾種思路可供參考:
目標對象時單例或者靜態類,則可以直接訪問
如果項目運行在Spring容器中,且目標對象為Bean,則可以通過 ApplicationContext#getBean 方式獲取
2. 接口調用在問題復現的場景下,比較常用了,傳入相同的參數,判斷接口的返回結果是否ok,用于定位數據異常
class DemoScript implements ITask { @Override void run() { // 獲取目標對象 xxxService = ApplicationContextHolder.getBean(xxx.class); req = buildRequest(); result = xxxService.execute(req); log.info("result: {}", result); } }
其實實際使用起來和前面沒什么區別,無非是線獲取到對應的Service,然后執行接口,當然在Spring的生態體系中,一個可展望的點就是支持自動注入依賴的bean
3. 定時任務首先明確一點,在我們的框架中,所有的任務都是隔離的,獨立的線程中調度的,當我們希望一個新的任務每隔多久執行一次,可以怎么做?
一個簡單的偽代碼如下
class DemoScript implements ITask { private volatile boolean run = false; @Override void run() { run = true; while(true) { doXXX(); try { Thread.sleep(1000); } catch(Exception e) { } if(!run) break; } } @Override void interrupt() { run = false; } }
注意下上面的實現,在run方法中,有一個死循環,一直在重復的調用 doxxx() 方法,在內部通過 Thread.sleep() 來控制頻率
在腳本改變或刪除之后,框架會回調 interrupt 方法,因此會將上面的run變量設置為false,從而結束死循環
注意:
對于定時任務而言,后續會擴展一個對應ScheduleTask抽象類出來,將循環和中斷的邏輯封裝一下,對于使用方而言,只需要寫業務邏輯即可,不需要關心這些重復的邏輯
4. mq消息消費這種更多的是把這個框架作為一個調度來用,我們接收mq的消息,然后在動態腳本中進行處理,再傳給第三方(如果集成在自己的項目中時,一個demo就是可以直接調用項目中的Dao保存數據)
一個RabbitMq的消費任務,對應的偽代碼如下
class DemoScript implements ITask { @Override void run() { ConnectionFactory fac = new CachingConnectionFactory(); fac.setHost("127.0.0.1"); fac.setPort(5672); fac.setUsername("admin") fac.setPassword("admin") fac.setVirtualHost("/") //創建連接 Connection connection = factory.newConnection(); //創建消息信道 final Channel channel = connection.createChannel(); //消息隊列 channel.queueDeclare(queue, true, false, false, null); //綁定隊列到交換機 channel.queueBind(queue, exchange, routingKey); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); try { System.out.println(" [" + queue + "] Received "" + message); } finally { channel.basicAck(envelope.getDeliveryTag(), false); } } }; // 取消自動ack channel.basicConsume(queue, false, consumer); } }
注意:
對于RabbitMQ的任務,后續計劃封裝一個抽象的任務腳本,使業務方只需要關注自己的消息處理即可,上面只是一個業務場景的使用演示
III. 其他 0. 相關博文:
180628-動態任務執行框架想法篇
180702-QuickTask動態腳本支持框架整體介紹篇
項目:
https://github.com/liuyueyi/quick-task
1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關注文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71667.html
摘要:動態腳本支持框架之任務動態加載前面幾篇博文分別介紹了整個項目的基本架構,使用說明,以及整體框架的設計與實現初稿,接下來則進入更細節的實現篇,將整個工程中核心實現撈出來,從為什么這么設計到最終的實現給予說明相關系列博文動態腳本支持框架整體 showImg(https://segmentfault.com/img/remote/1460000015806174); Quick-Task 動...
摘要:動態腳本支持框架之結構設計篇相關博文動態腳本支持框架整體介紹篇動態腳本支持框架之使用介紹篇前面兩篇博文,主要是整體介紹和如何使用接下來開始進入正題,逐步剖析,這個項目是怎么一步一步搭建起來的本篇博文則主要介紹基本骨架的設計,圍繞項目 showImg(https://segmentfault.com/img/remote/1460000015739044); Quick-Task 動態腳...
摘要:動態腳本支持框架之腳本加載執行上一篇簡答說了如何判斷有任務動態添加刪除或更新,歸于一點就是監聽文件的變化,判斷目錄下的文件是否有新增刪除和改變,從而判定是否有任務的變更接下來的問題就比較明顯了,當任務變更之后,就需要重新加載任務了,即如何 showImg(https://segmentfault.com/img/remote/1460000015923148); Quick-Task ...
摘要:軟件測試江湖二神兵利器篇在上一篇文章中我們介紹了江湖上流傳的各種軟件測試的武功秘籍和心法,相信看過的小伙伴內力得到了很大的提升。功能測試篇功能測試,是軟件測試里的入門級心法,自然也有與之相對應的兵器來發揮心法的最大功力。 軟件測試江湖(二)神兵利器篇 在上一篇文章中我們介紹了江湖上流傳的各種軟件測試的武功秘籍和心法,相信看過的小伙伴內力得到了很大的提升。如果沒有,一定是你看的姿勢不對,...
閱讀 1459·2021-09-30 09:57
閱讀 1466·2021-09-09 09:33
閱讀 2220·2021-09-04 16:40
閱讀 1792·2021-09-01 10:50
閱讀 3237·2021-09-01 10:31
閱讀 2539·2019-08-30 15:56
閱讀 2970·2019-08-30 15:44
閱讀 3475·2019-08-29 17:29