四、開發腳本處理引擎
以創建 Renewal quote 為例,首先在 Web 表單中填寫原始數據,表單如圖 7 所示:
圖 7. Create Renewal Quote 表單
然后點擊 Submit 按鈕,在確認輸入無誤后,點擊 Ok 按鈕提交該請求。此時數據傳遞到 RenewalQuoteAction 類中(RenewalQuoteAction 類繼承自 Struts2 的 ActionSupport 類),由 CreateRenewalQuote 方法來進行處理,如清單 3 所示:
清單 3. CreateRenewalQuote 方法
… … // 將從 Web 表單上獲取的原始數據以及一些實時數據(例如提交的時間等)保存到、//HandleRequest 的新的實例中 final HandleRequest handlerequest = new HandleRequest(); handlerequest.setIdb(inputData); handlerequest.setEnv(getEnv()); handlerequest.setRegion(getRegion()); … … // 將該請求添加到請求隊列中 handlerequest.addToQueue(handlerequest); // 從線程池中獲取唯一的單例線程來執行當前隊列中正需要處理的請求 TaskHandler.getThreadpool().execute(new Runnable(){ public void run(){ HandleRequest hr = null; int count = 0; while((hr = HandleRequest.requestQueue.poll())!=null){ count++; DataBaseManager dbm = new DataBaseManager(); Connection conn = null; try { // 向數據庫中添加一條新的請求記錄 conn = dbm.getConnection(); hr.insertRequestRecord(conn); } catch (SQLException e) { if(conn!=null) try { conn.close(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }finally{ } // 通過 executeRFTScript 方法來生成實例腳本并且驅動腳本執行,并且返回結果 String result = handlerequest.executeVBScript(hr); HandleRequest.setAccountIssueFlag(result,getRequestType(),getEnv()); } }); |
清單 4. executeRFTScript 代碼片段
… … // 根據 Web 表單提交的原始數據替換腳本模板中的占位符,獲得實際執行腳本的內容 String scriptContents = hr.returnRealScriptConent(spb,hr.getIdb(),hr.getEnv()); String outPut = ""; String additionalInfo = ""; StringBuffer resultV = new StringBuffer(); File file = null; try { createOutFiles(); // 生成腳本實例 file = File.createTempFile(hr.getRequestType()+"_ins", ".java"); file.deleteOnExit(); FileWriter fw = new FileWriter(file); fw.write(scriptContents); fw.close(); String scriptName = file.getName(); // 通過 RFT 提供的命令行方式進行腳本編譯 String []cmdCompile = new String[]{"cmd.exe","/c","java","-classpath",rftJarFile, "com.rational.test.ft.rational_ft","-datastore",projectPath,"-compile", "cases."+scriptName}; Process processCompile = Runtime.getRuntime().exec(cmdCompile); int complieFinished = processCompile.waitFor(); if(complieFinished!=0){ return "Compile error"; } // 通過 RFT 提供的命令行方式進行腳本回放 String []cmdArguments = new String[]{"cmd.exe","/c","java","-classpath",rftJarFile, "com.rational.test.ft.rational_ft","-datastore",projectPath,"-playback", "cases."+scriptName}; Process process = Runtime.getRuntime().exec(cmdArguments); conn = dbm.getConnection(); // 將請求的狀態更新到該請求對應的數據庫記錄中去 hr.updateRequestStatus(conn,"1"); //set status as 'in progress' // 監測執行結果,返回錯誤信息或者最終結果(省略下面的代碼)… … } |
原文轉自:http://www.anti-gravitydesign.com