• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Java注解的Drools業(yè)務規(guī)則開發(fā)框架設計實現(xiàn)

      2017-06-01 12:39:00周中雨,李洋,楊程屹
      電子測試 2017年6期
      關(guān)鍵詞:引擎代碼邏輯

      基于Java注解的Drools業(yè)務規(guī)則開發(fā)框架設計實現(xiàn)

      0 引言

      規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應用程序中的組件,實現(xiàn)了將業(yè)務決策從應用程序代碼中分離出來,并使用預定義的語義模塊編寫業(yè)務決策。規(guī)則引擎接受數(shù)據(jù)輸入,解釋業(yè)務規(guī)則,并根據(jù)業(yè)務規(guī)則做出業(yè)務決策。規(guī)則引擎適用于業(yè)務規(guī)則復雜且頻繁改動的系統(tǒng)。

      Drools是RedHat公司旗下一款基于Java語言的開源規(guī)則引擎,廣泛應用于金融、保險、電信等領(lǐng)域,可以將復雜多變的規(guī)則以規(guī)則腳本的形式存放在文件中,使得規(guī)則的變更不需要重啟機器就可以立即在線上環(huán)境生效。

      在業(yè)務規(guī)則開發(fā)過程中,Drools規(guī)則引擎只能識別與處理基于DRL(Domain Rule Language)格式定義的業(yè)務邏輯,與Java程序相比存在著一些缺陷,不能很好地支持企業(yè)級應用管理,主要表現(xiàn)在以下兩方面。

      (1)開發(fā)效率待提高:DRL語法學習成本較高;傳統(tǒng)Java開發(fā)環(huán)境(例如Eclipse)不支持對DRL進行語法檢查和語法輔助,無法在運行前發(fā)現(xiàn)語法錯誤;部分規(guī)則文件無法進行調(diào)試;重構(gòu)難度大,進行規(guī)則修改時很難評估影響范圍。

      (2)代碼質(zhì)量缺乏保障:無法通過代碼質(zhì)量管理工具(例如SonarQube)對DRL文件進行檢查與分析。

      為解決這些缺陷,迫切需要建立Drools業(yè)務規(guī)則開發(fā)框架,直接使用Java語言實現(xiàn)業(yè)務邏輯,單元測試通過后自動生成Drools業(yè)務規(guī)則。

      1 開發(fā)框架設計

      Drools業(yè)務規(guī)則開發(fā)框架主要由編寫模塊、執(zhí)行模塊、轉(zhuǎn)換模塊三部分組成。其中編寫模塊定義Java語言實現(xiàn)業(yè)務邏輯的規(guī)范;執(zhí)行模塊對Java語言實現(xiàn)的業(yè)務邏輯模擬執(zhí)行,并支持在傳統(tǒng)Java開發(fā)環(huán)境中進行代碼調(diào)試;轉(zhuǎn)換模塊將Java語言實現(xiàn)的業(yè)務邏輯轉(zhuǎn)換成Drools規(guī)則引擎支持的業(yè)務規(guī)則。

      Drools業(yè)務規(guī)則開發(fā)框架的使用流程如圖1所示。

      圖1 Drools業(yè)務規(guī)則開發(fā)框架的使用流程

      通過使用此開發(fā)框架,技術(shù)人員直接使用Java語言實現(xiàn)業(yè)務邏輯,將極大提高開發(fā)效率和代碼質(zhì)量。

      下面介紹Drools業(yè)務規(guī)則開發(fā)框架的實現(xiàn)技術(shù)。

      2 開發(fā)框架實現(xiàn)

      2.1 Java注解技術(shù)

      注解(annotation)是JDK1.5及以后版本引入的一個特性。注解(annotation)是一個接口,程序可以通過反射來獲取指定程序元素的注解對象,然后通過注解對象來獲取注解里面的元數(shù)據(jù)。

      元注解(meta-annotation)的作用是負責注解其他注解。Java5.0定義了4個標準的元注解類型,它們被用來提供對其它 注解類型作說明。其中元注解@Target說明了注解所修飾的對象范圍,元注解@Retention定義了該注解被保留的時間長短,分為三種情況:SOURCE表示出現(xiàn)在源代碼中但被編譯器丟棄;CLASS表示編譯在class文件中但在class文件裝載時被忽略;RUNTIME表示編譯在class文件中且在class裝載時被讀取。

      Java注解技術(shù)對于Drools業(yè)務規(guī)則開發(fā)框架至關(guān)重要?;谧⒔饧夹g(shù),執(zhí)行模塊獲取代碼中的元注解信息從而動態(tài)執(zhí)行Java代碼,轉(zhuǎn)換模塊獲取代碼中的元注解信息從而完成代碼分析從而轉(zhuǎn)換為DRL文件。

      2.2 編寫模塊

      編寫模塊中定義了三種注解,分別為RuleGroup、Rule、RuleFunction,這三種注解的@Retention都設置為RUNTIME,以便在執(zhí)行模塊及轉(zhuǎn)換模塊中獲取注解信息。

      RuleGroup標識在規(guī)則流中所屬的節(jié)點,定義如下:

      @Target({ ElementType.TYPE })

      @Retention(RetentionPolicy.RUNTIME)

      public @interface RuleGroup {

      String ruleflowGroup();

      }

      Rule標識業(yè)務規(guī)則屬性,如優(yōu)先級。定義如下:

      @Target({ ElementType.TYPE })

      @Retention(RetentionPolicy.RUNTIME)

      public @interface Rule {

      String salience() default "10000";

      }

      RuleFunction標識業(yè)務規(guī)則中調(diào)用的函數(shù)方法。定義如下:@Target({ ElementType.METHOD })

      @Retention(RetentionPolicy.RUNTIME)

      public @interface RuleFunction {

      }

      基于這三種注解,使用Java語言編寫的業(yè)務邏輯示例如下:@RuleGroup(ruleflowGroup="RequestRules")

      public class RequestRules {

      @Rule(salience = "10000")

      public static class Rule1 {

      public boolean when() { return true;

      }

      public void then() {

      func1();

      }

      }

      @RuleFunction

      static void func1() {

      }

      }

      從以上示例可以看到,技術(shù)人員使用Java語言實現(xiàn)業(yè)務邏輯,能夠進行語法檢查和語法輔助,也能通過代碼質(zhì)量管理工具保證代碼的規(guī)范性。

      2.3 執(zhí)行模塊

      執(zhí)行模塊采用反射技術(shù)加載Java語言編寫的業(yè)務邏輯并執(zhí)行,處理流程如圖2所示。

      圖2 執(zhí)行模塊處理流程圖

      具體處理流程如下:

      (1)按規(guī)則流節(jié)點順序加載使用RuleGroup注解的類;

      (2)獲取類中使用Rule注解的內(nèi)部類并按salience排序;(3)按順序執(zhí)行各內(nèi)部類;

      ①實例化內(nèi)部類innerRule;

      ②如果innerRule.when()結(jié)果為true則執(zhí)行inner Rule.then(),否則回到①實例化下一個內(nèi)部類。

      業(yè)務規(guī)則when部分的輸入為字符串,輸出為true或false,類似于Javascript中的eval()函數(shù)。執(zhí)行模塊采用規(guī)則引擎加載此字符串并執(zhí)行,核心代碼如下:

      // 加載DRL并執(zhí)行

      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory. newKnowledgeBuilder();

      kbuilder add(ResourceFactory newReaderResource(strReade r),ResourceType.DRL);

      KnowledgeBase kbase = kbuilder.newKnowledgeBase();

      StatefulKnowledgeSession ksession = kbase. newStatefulKnowledgeSession();

      ksession insert(messageWrapper);

      QueryResults results = ksession.getQueryResults(drlHash);

      // 對執(zhí)行結(jié)果進行判斷

      return (results.size() > 0);

      2.4 轉(zhuǎn)換模塊

      轉(zhuǎn)換模塊將Java文件轉(zhuǎn)換為Drools規(guī)則引擎支持的DRL文件,處理流程如圖3所示。

      圖3 轉(zhuǎn)換模塊處理流程圖

      具體處理流程如下:

      (1)按規(guī)則流節(jié)點順序加載Java文件;

      (2)使用開源的google JavaParser庫進行Java文件解析;

      (3)對使用Rule注解的內(nèi)部類進行循環(huán)處理,獲取ruleflow-group屬性、salience屬性、when部分、then部分及function部分;

      (4)將生成的符合Drools業(yè)務規(guī)則語法的字符串寫入DRL文件。

      3 開發(fā)框架應用

      從全球民航發(fā)展情況看,由于市場競爭不斷加劇,全球民航業(yè)長期處于微利運營水平。在日益艱難的市場環(huán)境中,國內(nèi)外航空公司在客運方面力圖沖破只能提供航空運輸?shù)膫鹘y(tǒng)服務模式,不斷探索新的商務模式和盈利渠道,正在發(fā)展成為以航空運輸為中心、集酒店、租車、旅游、免稅品銷售等服務于一體的航空旅游綜合服務提供商[4]。航空公司機票+酒店動態(tài)打包銷售平臺項目(簡稱動態(tài)打包項目)正是在這個大背景下立項并實施的。

      在開發(fā)動態(tài)打包項目時,采用了Drools規(guī)則引擎,基于規(guī)則流(RuleFlow)技術(shù)實現(xiàn)動態(tài)打包查詢、預訂、取消等功能,輸入輸出遵循OTA(Open Travel Alliance)國際標準。

      在實現(xiàn)中,將輸入輸出抽象為MessageWrapper,將每個功能的業(yè)務處理流程進行總結(jié),抽象為RequestRules、SwitchingRules、AggregationRules、ResponseOptionRules、ResponseRules共5個節(jié)點,分別實現(xiàn)請求校驗、外部系統(tǒng)調(diào)用、外部系統(tǒng)結(jié)果合并、響應結(jié)果過濾與排序、響應結(jié)果處理(如促銷價格計算)功能。節(jié)點名稱與RuleGroup中的ruleflowGroup屬性相對應。每個節(jié)點內(nèi)的業(yè)務規(guī)則按優(yōu)先級順序執(zhí)行,整體業(yè)務處理流程如圖4所示。

      圖4 業(yè)務處理流程圖

      為驗證開發(fā)框架在提高開發(fā)效率方面的效果,項目組選取動態(tài)打包查詢模塊進行比對實驗。選取兩個水平接近的開發(fā)人員,以通過預先設定的單元測試為完成標準,采用直接編寫DRL文件的開發(fā)方式共花費15人天,采用開發(fā)框架共花費11人天。

      根據(jù)以上比對實驗,通過使用Drools業(yè)務規(guī)則開發(fā)框架,動態(tài)打包項目提高開發(fā)效率20%以上,節(jié)省至少5人月開發(fā)工作量。同時在SonarQube中代碼質(zhì)量評級為A,取得預期效果。

      4 結(jié)論

      利用基于Java注解的Drools業(yè)務規(guī)則開發(fā)框架,技術(shù)人員可以方便的進行業(yè)務規(guī)則編寫、調(diào)試,提升代碼質(zhì)量,提高開發(fā)效率。

      動態(tài)打包項目中每個節(jié)點內(nèi)的業(yè)務規(guī)則按優(yōu)先級順序執(zhí)行,沒有涉及規(guī)則的重復觸發(fā)與沖突檢測,后續(xù)還需要持續(xù)改進完善。

      [1]張淵,夏清國.基于Rete算法的JAVA規(guī)則引擎[J].科學技術(shù)與工程,2006,6(11) :1548-1550.

      [2]李春芳,譚慶平. 面向業(yè)務的 Drools規(guī)則引擎改進[J]. 計算機應用與軟件,2015,32(5) :20-23.

      [3]凌晨,陳芳莉.Java注釋類型和APT [J]. 計算機系統(tǒng)應用,2006,15(9):78-82.

      [4]王欣明,呂明站.民航附加服務動態(tài)打包技術(shù)研究[J]. 民航科技,2011(3):39-42.

      [5]繳明洋,譚慶平. Java規(guī)則引擎技術(shù)研究[J]. 計算機與信息技術(shù),2006(3) :44-46.

      周中雨(1978——),男,河北省河間市,中級工程師,碩士研究生,主要從事J2EE平臺軟件架構(gòu)設計及研發(fā)。

      李洋(1977——),男,陜西省藍田縣,中級工程師,碩士研究生,主要從事J2EE平臺軟件架構(gòu)設計及研發(fā)。

      王懷超(1984——),男,天津,講師,博士研究生,主要研究方向航空物流、計算機視覺。

      楊程屹(1986——),男,河北省灤縣,中級工程師,博士研究生,主要從事數(shù)據(jù)挖掘、算法研究等工作。

      周中雨1,李洋1,楊程屹1,王懷超2
      (1.中國民航信息網(wǎng)絡股份有限公司,北京,100105;2.中國民航大學計算機科學與技術(shù)學院,天津,300300)

      本文設計并實現(xiàn)了基于Java注解的規(guī)則引擎Drools業(yè)務規(guī)則開發(fā)框架。該開發(fā)框架針對Drools業(yè)務規(guī)則存在的無法語法檢查、無法調(diào)試等問題,基于Java注解技術(shù),直接使用Java語言實現(xiàn)業(yè)務邏輯,單元測試通過后生成Drools業(yè)務規(guī)則,從而提升代碼質(zhì)量并提高開發(fā)效率。

      規(guī)則引擎;Drools;業(yè)務規(guī)則;Java注解;Java反射

      Design and Implementation on Framework for Developing Drools Business Rules Based on Java Annotation

      Zhou Zhongyu1,Li Yang1,Yang Chengyi1,Wang Huaichao2
      (1.Travelsky Technology Limited,Beijing,100105;2.College of Computer Science and Technology, Civil Aviation University of China,Tianjin,300300)

      We design and implement a framework for developing Drools business rules based on Java annotation in order to solve the problems such as absence of syntax checking, difficulty of debugging, etc. Using the framework developers implement business logic in Java language and translate Java files to Drools business rules after passing the unit test The framework is designed to improve code quality and efficiency

      Rule Engine;Drools;Business Rules;Java Annotation;Java Reflect

      2013年民航科技創(chuàng)新引導項目(MHRD20130216)。

      猜你喜歡
      引擎代碼邏輯
      刑事印證證明準確達成的邏輯反思
      法律方法(2022年2期)2022-10-20 06:44:24
      邏輯
      創(chuàng)新的邏輯
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      女人買買買的神邏輯
      37°女人(2017年11期)2017-11-14 20:27:40
      藍谷: “涉藍”新引擎
      商周刊(2017年22期)2017-11-09 05:08:31
      無形的引擎
      河南電力(2015年5期)2015-06-08 06:01:46
      宁强县| 富锦市| 湟中县| 宜阳县| 视频| 宁波市| 临潭县| 石嘴山市| 泊头市| 称多县| 武冈市| 香格里拉县| 察隅县| 萨嘎县| 永济市| 平湖市| 梓潼县| 天水市| 巴彦淖尔市| 靖州| 乌鲁木齐市| 高安市| 沅江市| 南投市| 丰镇市| 丘北县| 汉寿县| 安西县| 永新县| 蓬溪县| 通辽市| 宜兴市| 久治县| 宁河县| 衡阳县| 通江县| 沭阳县| 西贡区| 自贡市| 福建省| 新疆|