首页 > 代码库 > 从一个脚本谈loadrunner的脚本初始化
从一个脚本谈loadrunner的脚本初始化
昨天一个同事问我,如何实现下列代码中 InputStream类is对象的实例化?
* LoadRunner Java script. (Build: _build_number_)** Script Description:**/import lrapi.lr;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import com.google.common.io.ByteStreams;import com.demo.DemoFileSystem;public class Actions{ File file = new File("C:/8K.file"); InputStream is =null; // 返回一个byte数组 byte[] fileBytes = new byte[(int) file.length()]; // 创建一个数据来保存文件数据 DemoFileSystem dfs =new DemoFileSystem(); public int init() throws Throwable { is = new FileInputStream(file); ByteStreams.readFully(is, fileBytes); is.close(); return 0; } //end of init public int action() throws Throwable { try { lr.start_transaction("dfs-w"); String key = dfs.writeBytes(fileBytes); //上传 System.out.println(key); } catch (Exception e) { e.printStackTrace(); } lr.end_transaction("dfs-w", lr.AUTO); return 0; }//end of action public int end() throws Throwable { return 0; }//end of end }
尝试一:我们知道,在loadrunner的java_vuser协议的脚本中,init方法在每个vuer初始化的时候都会被执行一次,换句话说N个用户就会被执行N次,所以上面的脚本中inputStream对象会被初始化N次。我随即做了如下修改
File file = new File("C:/8K.file"); static InputStream is =null; // 返回一个byte数组 byte[] fileBytes = new byte[(int) file.length()]; public int init() throws Throwable { if(is==null){ is = new FileInputStream(file); } ByteStreams.readFully(is, fileBytes); is.close(); //初始化 return 0; }//end of init
理论上来说,上述代码实现了单例模式。但是这个脚本并发下无效。。。 经过和开发探讨最终换了以下的代码来处理:
尝试二:
static { File file = new File("C:/8K.file"); fileBytes = new byte[(int) file.length()]; // 创建一个数据来保存文件数据 try { InputStream is = new FileInputStream(file); ByteStreams.readFully(is, fileBytes); is.close(); } catch (Exception e) { e.printStackTrace(); } }
思考:
第一种解决方法采取的是“饱汉单例模式”、非线程安全的,第二种则是使用了静态初始化块所以没有线程安全问题,如果使用“饿汉单例模式”是不是也可以实现呢?
从一个脚本谈loadrunner的脚本初始化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。