我们使用mozlia rhino生成动态类,然后通过自定义类加载器加载JsClass,如下所示
DynamicClassLoader loader = new DynamicClassLoader(JavaScriptFactory.class.getClassLoader());
Class<?> jsClass = loader.loadClass("D://","com.huawei.xxx");
jsClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,每个JsClass都有一个单独的类加载器,当用户修改js时,我们也会通过这段代码重新加载JsClass,
现在,我们面临一个问题,当调用 jsClass.newInstance() 时,某些线程在 getDeclaredConstructors0 处挂起很长一段时间(3s-1000s),通常应该小于 10ms。有人可以告诉我可能的原因吗?非常感谢!
JDK: 1.8.0.60
雄猫: 7.0.59
Jvm参数:
-Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -DDN=mateinfo_app -server -Duser.timezone=GMT -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCDetails -Xloggc:/opt/mateinfo/logs/app/tomcat-gc-20160601-233343.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/mateinfo/logs/app/oom-20160601-233343.bin -XX:OnOutOfMemoryError=./deal-oom.sh -Xms3260m -Xmx3260m -Xmn800m -XX:MetaspaceSize=800m -XX:MaxMetaspaceSize=800m -XX:SurvivorRatio=16 -XX:+OptimizeStringConcat -Xverify:all -Dsoapui.log4j.config=/opt/mateinfo/app/lib/log4j.properties -Dlog4j.ignoreTCL=true -XX:-OmitStackTraceInFastThrow -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8050 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs=/opt/mateinfo/app/endorsed -classpath /opt/mateinfo/app/bin/bootstrap.jar:/opt/mateinfo/app/bin/tomcat-juli.jar -Dcatalina.base=/opt/mateinfo/app -Dcatalina.home=/opt/mateinfo/app -Djava.io.tmpdir=/opt/mateinfo/app/temp org.apache.catalina.startup.Bootstrap start
Run Code Online (Sandbox Code Playgroud)
线程转储:
----------------- 7123 -----------------
0x00007f9d44cdc6d5 __pthread_cond_wait + 0xc5
0x00007f9d43cc157c _ZN15JvmtiRawMonitor11SimpleEnterEP6Thread + 0xdc …
Run Code Online (Sandbox Code Playgroud) 任何人都了解犀牛javascript上下文?我找不到任何有用的文档.我的主要问题是Context.exit()(真的应该是cx.exit())根据我的理解退出与当前线程相关的上下文?这是否意味着我需要跟踪哪个线程的作用?
主线程:
Context cx;
cx.evaluateReader( ... ) // load some function
start thread 2
Run Code Online (Sandbox Code Playgroud)
线程2:
Object o= scope.get("methodname", scope);
((Function)o).call( ... )
Run Code Online (Sandbox Code Playgroud)
我不打算做多线程但是如果不同的设置来自不同的线程怎么办?
我使用Java的ScriptEngine执行JavaScript代码。我使用Invocable接口,以便可以将脚本代码用作实现Java接口的普通Java对象。
如果JavaScript代码
我在执行代码时从Rhino或UndeclaredThrowableException获得内部异常。两者都是RuntimeException,不能“允许”捕获。
有没有一种方法可以在执行之前验证代码?还是我必须在这里打破规则并捕获RuntimeExceptions?那对我有用,但是最优雅的方法是什么?
我正在编写一个应用程序,让用户使用Raphael.JS生成图像.我想要的一个次要功能是生成Raphael画布的PNG.
这是我头脑中的一般管道:
第4步是我需要一些指导的步骤.用户可能正在使用IE; 我们无法保证JS是在SVG浏览器中执行的.无论如何,我们需要在服务器端运行才能保证可靠性.所以这是我到目前为止提出的三种可能性:
所以......所有这三个选项都很糟糕.我认为.我错了什么?还有另外一种方法吗?
在sun.org.mozilla版本的Rhino中,JavaAdapter
根据此错误消息,仅将接口作为其第一个参数而不是任何其他类.
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorExcep
tion: JavaAdapter: first arg should be interface Class (<Unknown source>#11) in
<Unknown source> at line number 11
Run Code Online (Sandbox Code Playgroud)
有没有什么方法,无论多么hacky,通过Rhino扩展一个抽象类(或普通类)?
这是违规代码:
var j = new JavaAdapter(foo.bar.abstractClass, {
field : "test",
method : function () {
print("on enable");
}
});
Run Code Online (Sandbox Code Playgroud) 我有一个项目,我正在为我的公司工作,现在我需要决定我应该使用哪个JS引擎.目前我的选择是Spidermonkey或Rhino.
我主要担心的是性能和可扩展性,我想知道是否进行了性能测试以比较两个引擎?
谷歌搜索这个问题比我想象的更难.
在此先感谢您的帮助,Ben.
我是犀牛的新手.
目前,我正在通过.NET 4和IKVM.NET使用Rhino 1.7R框架.我使用setWrapFractory()API公开了几个实现NativeJavaObject的包装类.
public class InterceptNativeObject : NativeJavaObject
{
public InterceptNativeObject()
{
}
public override Object get(String name, Scriptable start)
{
Object res = base.get(name, start);
if (res is NativeJavaMethod)
{
NativeJavaMethod method = (NativeJavaMethod)res;
return new RhinoMethodWrapFunction(method);
}
if (res == org.mozilla.javascript.UniqueTag.NOT_FOUND &&
base.javaObject is IPropertBox && base.javaObject != null)
{
object ret = ((IPropertBox)base.javaObject)._x__GetPropertyValue(name);
return Utils.ConvertCLRValueToJavaValue(ret);
}
return res;
}
.....
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以按照自己的意愿访问所有.NET方法和属性.
我目前的问题是支持'for ... in'我的NativeJavaObject类.当我评估
'for(var prop in myClass){printf(prop);};' ,
Run Code Online (Sandbox Code Playgroud)
它在'调用非对象'错误中返回'no'.
似乎'get'试图搜索' _ iterator _ ' …
我想公开一个Java方法,以便可以通过任意脚本调用它.然后,脚本应该能够对返回值执行算术运算.
问题是虽然公开方法返回Java Integer
,但脚本实际上并没有获得常规数字,而是实例org.mozilla.javascript.NativeJavaObject
.
这是一些显示行为的简化测试代码:
public class RhinoTest
{
public static void main(String[] args)
{
String script = "foo.getBar() + 1";
Context context = Context.enter();
ScriptableObject scriptableObject = context.initStandardObjects();
ScriptableObject.putProperty(scriptableObject, "foo", new Foo());
Object result = context.evaluateString(scriptableObject, script, "FooBar", 1, null);
Context.exit();
System.out.println(result);
}
public static class Foo
{
public Integer getBar()
{
return 9;
}
}
}
Run Code Online (Sandbox Code Playgroud)
预期的结果是10
,但脚本返回91
.
那么如何getBar()
在脚本内部进行调用实际上会返回常规的Javascript数据类型?请注意,我不想通过添加unwrap()
呼叫parseint()
等来更改脚本代码.
我正在尝试为PlayFramework 2.1编写一个SBT插件,它可以预编译位于app/assets/templates中的把手模板.我当然会在完成后分享这个插件.我发现这个HOWTO http://eng.netwallet.com/2012/04/25/emberhandlebars-template-precompilation-with-play/这是一个有点过时,但它是适应它玩没问题!2.1.
然后我尝试编译一个简单的模板文件,但SBT失败了以下内容:
ember: processing template test
[error] /.../templates/test.handlebars: Compilation error[unexpected exception during Ember compilation (file=/.../templates/test.handlebars, options=List(), ember=ember-1.0.0-pre.4.js): org.mozilla.javascript.EvaluatorException: missing name after . operator (ember-1.0.0-pre.4.js#3309)]
[error] (MyProject/*:play-copy-assets) @6dap83075: Compilation error in /.../templates/test.handlebars:null
[error] (MyProject/compile:resources) @6dap83075: Compilation error in /.../templates/test.handlebars:null
Run Code Online (Sandbox Code Playgroud)
第3309行的ember-1.0.0-pre.4.js有一个volatile关键字,显然是在Rhino中保留的.
我远非犀牛专家,这就是为什么我想知道是否有人知道如何解决这个问题?我现在不是在寻找5*解决方案.任何解决方案(即使是使用自定义ember.js的快速和肮脏的黑客)都有合理的机会为大多数简单的把手模板工作都可以工作,我们担心一旦功能出现并且SBT插件出来就抛光它.
提前致谢!
问题是标题所说.处理需要通过IronPython导入Sympy,Matplotlib和Tkinter的项目.代码将在Rhino中运行,后者使用Python 2.7.有没有办法做到这一点?我看过一个2014年的问题,说Tkinter在IronPython中不起作用,但从那时起事情就有所改善.
SymPy是需要导入的最重要的库.已查看过文档,但有点不清楚.
所以我已经能够将pythonnet安装到我的python解释器中,之后在cmd上用.whl文件进行了大量的处理.现在,当我们尝试在Anaconda(Python 2.7)中导入clr时,我们遇到了以下错误:
所以在编译下面的代码片段之后 -
import clr
clr.AddReference("System.Windows.Forms")
from System import String
from System.Collections import *
from System.Windows.Forms import Form
print "Hello"
Run Code Online (Sandbox Code Playgroud)
我们收到此错误:
'import sitecustomize' failed; use -v for traceback
Hello
Run Code Online (Sandbox Code Playgroud)
import语句下面的任何代码仍然运行(因此'Hello'),但我想知道这个错误意味着什么或导致它的原因.提前致谢.
发表在Rhino论坛上,显然Rhino的IronPython实现中没有任何变化,使其能够引用以前不兼容的库.他们建议改用Eto.谢谢您的帮助!
rhino ×10
javascript ×6
java ×5
.net ×1
classloader ×1
embedding ×1
ember.js ×1
ikvm ×1
image ×1
ironpython ×1
jvm ×1
matplotlib ×1
png ×1
precompile ×1
raphael ×1
scriptengine ×1
scripting ×1
spidermonkey ×1
sympy ×1
tkinter ×1