标签: rhino

为什么 java newInstance 挂在 getDeclaredConstructors0 处?

我们使用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)

java jvm rhino classloader

6
推荐指数
1
解决办法
2108
查看次数

犀牛嵌入

任何人都了解犀牛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 rhino embedding

5
推荐指数
1
解决办法
2602
查看次数

验证JavaScript代码

我使用Java的ScriptEngine执行JavaScript代码。我使用Invocable接口,以便可以将脚本代码用作实现Java接口的普通Java对象。

如果JavaScript代码

  • 是无效的
  • 不遵循界面(缺少方法,错误的返回类型,引发异常等)

我在执行代码时从Rhino或UndeclaredThrowableException获得内部异常。两者都是RuntimeException,不能“允许”捕获。

有没有一种方法可以在执行之前验证代码?还是我必须在这里打破规则并捕获RuntimeExceptions?那对我有用,但是最优雅的方法是什么?

javascript java rhino scriptengine

5
推荐指数
1
解决办法
4688
查看次数

以编程方式从Raphael.JS图像生成PNG

我正在编写一个应用程序,让用户使用Raphael.JS生成图像.我想要的一个次要功能是生成Raphael画布的PNG.

这是我头脑中的一般管道:

  1. 用户输入参数
  2. 我们用Raphael调用生成JS
  3. 我们生成一个JS包装器,它执行上述操作并在包含div上调用.innerHTML,为我们提供SVG(然后我们将其发送到某处)
  4. 我们执行JS包装器
  5. SVG被发送到ImageMagick并弹出一个PNG

第4步是我需要一些指导的步骤.用户可能正在使用IE; 我们无法保证JS是在SVG浏览器中执行的.无论如何,我们需要在服务器端运行才能保证可靠性.所以这是我到目前为止提出的三种可能性:

  • 在服务器上安装Firefox并在Firefox中运行(3)的结果.这个选项很糟糕,因为安装FF意味着在我们的服务器上安装一堆X东西,运行FF会带来很多开销,而且我真的不想跟踪进程并在完成后终止它.
  • 使用Node.js + jsdom(http://github.com/tmpvar/jsdom).这里的缺点是,目前还不清楚jsdom是如何得到支持的 - 声称的网站jsdom.org并不存在.另外,我找不到任何文件.
  • 也许与Rhino做点什么?据我所知,Rhino的DOM支持甚至比Node还要少.

所以......所有这三个选项都很糟糕.我认为.我错了什么?还有另外一种方法吗?

javascript png image rhino raphael

5
推荐指数
1
解决办法
1996
查看次数

sun.org.mozilla Rhino和扩展Java抽象类

在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)

javascript java scripting rhino

5
推荐指数
1
解决办法
1998
查看次数

Rhino VS Spidermonkey性能测试

我有一个项目,我正在为我的公司工作,现在我需要决定我应该使用哪个JS引擎.目前我的选择是Spidermonkey或Rhino.

我主要担心的是性能和可扩展性,我想知道是否进行了性能测试以比较两个引擎?

谷歌搜索这个问题比我想象的更难.

在此先感谢您的帮助,Ben.

javascript rhino spidermonkey

5
推荐指数
2
解决办法
2743
查看次数

如何在Rhino中启用'for ... in'我的NativeJavaObject?

我是犀牛的新手.

目前,我正在通过.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 _ ' …

.net javascript ikvm rhino

5
推荐指数
1
解决办法
608
查看次数

Rhino:如何从JavaScript调用的Java方法返回Integer?

我想公开一个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()等来更改脚本代码.

javascript java rhino

5
推荐指数
1
解决办法
1515
查看次数

Playframework 2.1预编译ember把手

我正在尝试为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插件出来就抛光它.

提前致谢!

rhino precompile handlebars.js playframework-2.0 ember.js

5
推荐指数
1
解决办法
1342
查看次数

是否可以安装Matplotlib,Tkinter,SymPy并将其导入IronPython以便在Rhino中使用?

问题是标题所说.处理需要通过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.谢谢您的帮助!

ironpython tkinter rhino matplotlib sympy

5
推荐指数
0
解决办法
596
查看次数