四、开发脚本处理引擎
以创建 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' // 监测执行结果,返回错误信息或者最终结果(省略下面的代码)… … } |