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

