You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter调用TypeDB操作Jar包时Stream<JSON>执行失败求助

TypeDB CRUD程序在JMeter BeanShell中执行失败的问题分析

问题描述

我正在编写用于TypeDB的CRUD操作程序:单独创建类并实例化调用时,能够正常获取JSON格式的响应;但将该类打包为Jar包后,通过JMeter的BeanShellSampler调用时,代码执行到answers.limit(100).forEach(json -> System.out.println("JSON: " + json.toString()))及answers.count()处均失败。

JMeter控制台报错为BeanShell解释器调用方法失败,已导入com.vaticle.typedb.driver相关依赖包,所有Jar包已放置在JMETER/lib目录。

核心代码

private static Stream fetchAllUsers(TypeDBDriver driver, String dbName) {
 Stream<JSON>  answers = null;
 try (TypeDBSession session = driver.session(dbName, TypeDBSession.Type.DATA)) {
     try (TypeDBTransaction tx = session.transaction(TypeDBTransaction.Type.READ)) {
         String query = "match\r\n"
                + "$user isa user, has name \"Alex\";\r\n"
                + "\r\n"
                + "(subject: $user, action: $act) isa permission;\r\n"
                + "fetch\r\n"
                + "$act: name;\r\n"
                + "";
        System.out.println("CP-4w3");
      answers = tx.query().fetch(query);
       System.out.println("CP-5-..-");
answers.limit(100).forEach(json -> System.out.println("JSON: " + json.toString()));

失败原因

  • BeanShell对Java 8+特性支持不足:BeanShell基于Java 1.6实现,不支持Lambda表达式(代码中的json -> System.out.println(...))和Stream API的部分操作。单独运行时用标准Java环境支持这些特性,但BeanShell无法解析这类语法,直接触发调用失败。
  • Stream资源生命周期不匹配:Stream是惰性求值的,你在try-with-resources块内获取answers,但当try块结束后,TypeDBTransaction和Session会自动关闭,此时Stream依赖的连接资源已释放。单独运行时在try块内直接消费Stream没问题,但BeanShell调用可能存在执行延迟,导致操作Stream时资源已失效。

解决方案

  1. 替换Lambda为匿名内部类:把forEach中的Lambda表达式改成传统的匿名Consumer实现,适配BeanShell的语法要求,示例:
    answers.limit(100).forEach(new Consumer<JSON>() {
        @Override
        public void accept(JSON json) {
            System.out.println("JSON: " + json.toString());
        }
    });
    
  2. 在资源释放前完成Stream消费:在TypeDBTransaction和Session的try-with-resources块内部,将Stream结果收集到List等容器中,再进行后续处理,避免资源关闭后操作Stream:
    List<JSON> resultList = answers.limit(100).collect(Collectors.toList());
    // 后续处理resultList
    
  3. 改用JSR223 Sampler+Groovy:Groovy完全兼容Java 8+特性,稳定性和性能都优于BeanShell,建议替换BeanShell Sampler为JSR223 Sampler并选择Groovy语言执行代码。

内容的提问来源于stack exchange,提问作者Mahesh A R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:53:27