当我的 JSR 223 Groovy 脚本尝试访问启用了 JMeter 2.3 身份验证的 MonDB 3.0.3 时,我遇到了问题:
import com.mongodb.DB;
import org.apache.jmeter.protocol.mongodb.config.MongoDBHolder;
DB db = MongoDBHolder.getDBFromSource("mongoDS", "${mongodb_database}", "${mongodb_user}", "${mongodb_password}");
DBCollection coll = db.getCollection("users");
BasicDBObject query = new BasicDBObject("userId",vars.get("userId"));
DBCollection coll = db.getCollection("users");
这是输出:
2015/09/02 16:45:05 ERROR - meter.protocol.java.sampler.JSR223Sampler:
Problem in JSR223 script Sample MongoDB, message:javax.script.ScriptException:
java.lang.NullPointerException javax.script.ScriptException: java.lang.NullPointerException
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:326)
at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:44)
at javax.script.CompiledScript.eval(CompiledScript.java:92)
at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:200)
at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:70)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at org.apache.jmeter.protocol.mongodb.config.MongoDBHolder.getDBFromSource(MongoDBHolder.java:51)
at org.apache.jmeter.protocol.mongodb.config.MongoDBHolder$getDBFromSource.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:149)
at Script8.run(Script8.groovy:13)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:323)
... 7 more
在 MongoDB 中启用身份验证之前,我没有遇到任何问题。 任何帮助将不胜感激。
编辑:这是我的原始测试计划的片段:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.8" jmeter="2.13 r1665067">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="functional-test" enabled="true">
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="mongodb_server" elementType="Argument">
<stringProp name="Argument.name">mongodb_server</stringProp>
<stringProp name="Argument.value">"MONGODB_SERVER_IP"</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="mongodb_user" elementType="Argument">
<stringProp name="Argument.name">mongodb_user</stringProp>
<stringProp name="Argument.value">"MY_MONGO_USER"</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="mongodb_password" elementType="Argument">
<stringProp name="Argument.name">mongodb_password</stringProp>
<stringProp name="Argument.value">"MY_PASSWORD"</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="mongodb_database" elementType="Argument">
<stringProp name="Argument.name">mongodb_database</stringProp>
<stringProp name="Argument.value">"MY_DB"</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</Arguments>
<hashTree/>
<MongoSourceElement guiclass="TestBeanGUI" testclass="MongoSourceElement" testname="MongoDB Source Config" enabled="true">
<boolProp name="autoConnectRetry">false</boolProp>
<intProp name="connectTimeout">0</intProp>
<stringProp name="connection">${mongodb_server}</stringProp>
<intProp name="connectionsPerHost">10</intProp>
<boolProp name="continueOnInsertError">false</boolProp>
<boolProp name="fsync">false</boolProp>
<longProp name="maxAutoConnectRetryTime">0</longProp>
<intProp name="maxWaitTime">120000</intProp>
<boolProp name="safe">false</boolProp>
<boolProp name="socketKeepAlive">false</boolProp>
<intProp name="socketTimeout">0</intProp>
<stringProp name="source">myMongoDBSource</stringProp>
<intProp name="threadsAllowedToBlockForConnectionMultiplier">5</intProp>
<boolProp name="waitForJournaling">false</boolProp>
<intProp name="writeOperationNumberOfServers">0</intProp>
<intProp name="writeOperationTimeout">0</intProp>
</MongoSourceElement>
<JSR223Sampler guiclass="TestBeanGUI" testclass="JSR223Sampler" testname="Sample MongoDB" enabled="true">
<stringProp name="cacheKey">pol</stringProp>
<stringProp name="filename"></stringProp>
<stringProp name="parameters"></stringProp>
<stringProp name="script">
import com.mongodb.DB;
import org.apache.jmeter.protocol.mongodb.config.MongoDBHolder;
DB db = MongoDBHolder.getDBFromSource("mongoDS", "${mongodb_database}", "${mongodb_user}", "${mongodb_password}");
DBCollection coll = db.getCollection("users");
BasicDBObject query = new BasicDBObject("userId",vars.get("userId"));
DBCollection coll = db.getCollection("users");
</stringProp>
<stringProp name="scriptLanguage">groovy</stringProp>
</JSR223Sampler>
</jmeterTestPlan>
最佳答案
最后,我通过将 Apache-JMeter lib 目录中的“mongo-java-driver-2.11.3.jar”替换为“mongo-java-driver-2.13.2.jar”找到了解决方案。可能是 Mongo 3 身份验证存在一些问题。
我还修改了代码以使其工作:
import com.mongodb.*
import com.mongodb.BasicDBObject
MongoCredential coreCredential = MongoCredential.createCredential("${mongodb_user}", "${mongodb_database}", "${mongodb_password}".toCharArray());
MongoClient coreMongoClient = new MongoClient(new ServerAddress("${mongodb_server}", 27017), Arrays.asList(coreCredential));
DB coreDB = coreMongoClient.getDB("${mongodb_database}");
DBCollection coll = coreDB.getCollection("users");
...
现在一切正常。
关于mongodb - JSR223 (Groovy) 无法在 Jmeter(2.13) 中访问 MongoDB(3.0.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354645/
我想使用ruby-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby-prof可以写入任何输出之前杀死它。如何在不中断ruby-prof的情况下停止mongrel服务器? 最佳答案
我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多
我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序
我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")
我正在尝试使用聚合框架(使用ruby)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u
我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结
最近我一直在尝试使用Groovy和Grails,我不得不说这个框架所提供的简单性和生产力给我留下了深刻的印象。在过去,我也曾通过RubyonRails和其他方式向世界问好,有同样的感觉,所以很明显,当涉及到网络应用程序时,DRYKISS绝对是必经之路。问题是,在我目前工作的地方,人们对Microsoft很感兴趣,我猜他们会不太愿意接受这些珠宝,所以我想知道是否有任何.NET项目实现了与Grails和Rails相同的原则?您的意见将不胜感激。非常感谢! 最佳答案 敏锐的架构:http://code.google.com/p/sharp
常规:如果有my_object->访问'name'并大写my_object?.name?.capitalize()对于ruby来说,避免nil对象访问属性的等效项是什么?谢谢 最佳答案 这适用于Rails:my_object.try(:name).try(:capitalize)如果你想让它在Ruby中工作,你必须像这样扩展Object:classObject###@person?@person.name:nil#vs#@person.try(:name)deftry(method)sendmethodifrespond_to?
我想知道Groovy中Collection的所有(或没有)项目是否满足特定条件。我知道在ruby中(以及在带有linq的c#中),您可以调用all?和none?之类的方法并将条件作为闭包传递以完成此操作.在Groovy中是否有与此方法等效的方法? 最佳答案 是的,它的!any(对于Ruby的none)和every(对于Ruby的all):deflist=[1,2]assert!list.any{it0}另请参阅http://groovy.codehaus.org/JN1015-Collections处的文档
在Groovy中,有一个很好的语法来处理空值。例如,我可以做一个if语句:if(obj1?.obj2?.value){}这不会抛出NullPointerException,即使obj1为null(它的计算结果为false)。这是非常方便的东西,所以想知道是否有我错过的Ruby等价物。 最佳答案 在Rails应用程序中有Object#try所以你可以这样做obj1.try(:obj2).try(:value)或者用一个block(如下面的评论所述)obj.try{|obj|obj.value}更新在ruby2.3中有这样的运算符: