从一个脚本谈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();
    }

}

思考:

第一种解决方法采取的是“饱汉单例模式”、非线程安全的,第二种则是使用了静态初始化块所以没有线程安全问题,如果使用“饿汉单例模式”是不是也可以实现呢?

时间: 2024-12-20 18:46:38

从一个脚本谈loadrunner的脚本初始化的相关文章

LoadRunner学习---脚本编写(4)(比较重要)

今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了. Web用户Action 在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的: * web_url是浏览器地址栏的URL. * web_link是点击在<a href= ...>和<a>之间的文本超链接. * web_image是点击HTML的<img href= link. *

LoadRunner 性能测试脚本

1   概述 脚本录制编写是性能测试的一个重要环节.在性能测试过程中,虚拟用户模拟真实用户使用被测系统,这个"模拟"的过程正是通过性能测试脚本来实现的.因此,编写一个准确无误的脚本对性能测试有至关重要的意义.完成性能测试脚本包括两个步骤:脚本录制和脚本编写,本文重点关注脚本编写. 2   脚本录制 2.1.录制方式 HTTP协议脚本录制可选两种方式:基于HTML和基于URL.选择哪种录制方式的原则如下:基于浏览器的HTTP应用系统选择HTML,基于其他方式的HTTP应用系统选择URL.

一个检测应用状态的脚本

#!/bin/sh #Description:       Check ICE3.0 State #Last Update:       2014/06/11/01 WORKDIR=`pwd` export REPORTDIR=$WORKDIR/`date "+%Y%m%d%H%M%S"` export TG=`date "+%Y%m%d%H%M%S"` export BEGIN=`date -d "-1 hour" "+%H:%M:%

MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成CREATE和INSERT T-SQL脚本. Mssql-scripter是一个跨平台的命令行工具,功能等同于SQL Server Management Studio中的Generate and Publish Scripts Wizard. 咱们能够在Linux.macOS和Windows上使用它

一个转换编码格式的VBS脚本

今天看到了一个转换编码格式的VBS脚本程序,但是只能转换2种,改造了一下,可以自己指定转换格式.支持: utf-8 ansi 或者是 gb2312 unicode 之间的相互转换.自动探测文件格式,手工指定输出格式,默认输出格式为utf-8.可以直接改变文件编码,也可以输出为另外的一个文件.支持强制覆盖选项. 用法为: cscript chcode.vbs inputfile.txt 会把inputfile.txt转换为utf-8格式编码 cscript chcode.vbs inputfile

用 C 语言和 nkCEngine 写了一个基于命令的迷你脚本编译器与脚本播放器

首先,博主感到非常高兴,就在很久以前,博主就想写一个属于自己的脚本引擎,哪怕功能再简单也好,只要能跑起来就行了,直到今天,博主终于向这个梦想迈出了第一步,将脚本引擎的雏形给做了出来,因为这个脚本系统属于 nkCEngine 的一部分,所以博主将其命名为 nkScript,nkScript 是一门基于命令的语言,没有复杂的函数调用,没有复杂的循环语句,它拥有的,是简单的数值运算语句.条件跳转语句.无条件跳转语句.命令语句,等等:nkScript 的开发目标主要是用于制作简单的文字冒险游戏,就是那种

linux第一个C语言和sh脚本

linux第一个C语言 $ gedit hello_world.c #include <stdio.h> int main(void) { printf("hello world!\n"); return 0; } 保存后使用 gcc 生成可执行文件: $ gcc -o hello_world hello_world.c gcc 生成二进制文件默认具有可执行权限,不需要修改 ,然后直接执行即可 linux 第一个sh脚本文件 先创建脚本文件:gedit hello_shel

LoadRunner同一个脚本运行两次结果相差很大的原因

如果同一个脚本运行两次结果相差特别大.后一次的响应时间比前一次的响应时间慢了特别多,而期间开发又未修改过程序排查问题: 1.查看下linux内存利用情况 free -m 是查看内存情况 (通常可用内存占10%是可接受范围内) 如果可用内存很小的话 :一种可能是程序有问题 :另一种可能是磁盘空间不足了 当磁盘空间不足就会去写内存 2.可以先看下第二种情况成立否 : 命令 tf -m 查看磁盘空间情况结果看到磁盘空间为0了 3.查看哪个进程占用了这么多 ,最好通过log日志进行分析.在运行性能测试脚

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本。

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本.