- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用嵌入式 Rhino 的第 3 方应用程序中编写一段 javascript (ecmascript)。应用程序可以启动多个Java线程来同时处理数据。似乎每个 Java 线程都会启动自己的嵌入式 Rhino 上下文,而该上下文又会运行我的脚本。
我的脚本的目的是从应用程序接收数据并使用它来维护特定文件的内容。我需要一个故障安全解决方案来处理脚本的并发性。
到目前为止,我想到的是调用java并使用java.nio.channels.FileLock
。但是,文档here状态:
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.
果然,阻塞调用FileChannel.lock()
不会阻塞,而是抛出异常,导致下面的丑陋代码:
var count = 0;
while ( count < 100 )
{
try
{
var rFile = new java.io.RandomAccessFile(this.mapFile, "rw");
var lock = rFile.getChannel().lock();
try
{
// Here I do whatever the script needs to do with the file
}
finally
{
lock.release();
}
rFile.close();
break;
} catch (ex) {
// This is reached whenever another instance has a lock
count++;
java.lang.Thread.sleep( 10 );
}
}
问:如何安全可靠地解决这个问题?
我看过有关 Rhino sync()
的帖子,它与 Java synchronized
类似,但这似乎在 Rhino 的多个实例之间不起作用。
更新
我尝试了使用 Synchronizer
和 org.mozilla.javascript.tools.shell.Global
作为模板的建议:
function synchronize( fn, obj )
{
return new Packages.org.mozilla.javascript.Synchronizer(fn).call(obj);
}
接下来,我按如下方式使用该函数:
var mapFile = new java.io.File(mapFilePath);
// MapWriter is a js object
var writer = new MapWriter( mapFile, tempMap );
var on = Packages.java.lang.Class.forName("java.lang.Object");
// Call the writer's update function synchronized
synchronize( function() { writer.update() } , on );
但是我看到两个线程同时进入 update()
函数。我的代码有什么问题吗?
最佳答案
根据 Rhino 的嵌入方式,有两种可能性:
如果代码在 Rhino shell 中执行,请使用 sync(f,lock)
function 将函数转换为在第二个参数或 this
上同步的函数如果第二个参数不存在,则为其调用的对象。 (早期版本仅具有单参数方法,因此除非您的第三方应用程序使用最新版本,否则您可能需要使用该版本或自行推出;请参见下文。)
如果应用程序未使用 Rhino shell,而是使用不包含并发工具的自定义嵌入,则您需要推出自己的版本。 sync
的源代码是一个很好的起点(请参阅 Global 和 Synchronizer 的源代码;您应该能够像 Global 使用 Synchronizer 一样开箱即用)。
问题可能是您尝试同步的对象不是跨上下文共享的,而是通过嵌入或其他东西多次创建的。如果是这样,您可能需要使用某种黑客手段,特别是如果您无法控制嵌入。如果您无法控制嵌入,则可以使用某种虚拟机全局对象进行同步,例如 Runtime.getRuntime()
或其他东西(我想不出任何我立即知道的单一对象,但我怀疑其中有几个具有像 Runtime
这样的单一 API 的对象。)
另一个需要同步的候选对象是 Packages.java.lang.Class.forName("java.lang.Object")
,它应该在所有上下文中引用相同的对象(Object
类),除非嵌入的类加载器设置非常不寻常。
关于javascript - 多个 Rhino (java) 线程操作同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31027709/
尝试使用 RhinoMock 模拟函数。 var repository = new Rhino.Mocks.MockRepository(); var classMock = repository.D
我已经阅读了很多示例/教程(包括 Ayende 在 MSDN 上的 Alexandria)。 但事实证明,仅仅获得一些更新的程序集本身就是一个障碍。获得正确版本的 CaSTLe.Windsor 后 -
我正在使用 java 运行用 Rhino 编写的命令行实用程序,但如果出现错误,我需要将该错误返回给 shell,以便停止处理。如何将错误代码从 Rhino 传回给 shell? 最佳答案 你可以用
为了它的乐趣,我尝试使用 envjs 在 Rhino 中运行 JSLinux,它似乎没有抛出任何错误,也似乎不起作用。 如此处所述:How do I locally host the webbrows
有谁知道为什么 UsernameExists 不会返回 True。我的语法一定在某个地方搞砸了。 [TestMethod()] public void GenerateUsername
Rhino Mock 库是否有可比较且可靠的替代品。我现在将 Rhino 用于 MVC ASP.NET 项目,但正在考虑(就像计划 B)看看是否有任何其他等效的替代方案。 最佳答案 RhinoMock
我有一个 Java 7 项目,该项目大量使用 Javascript 来编写各种功能的脚本。到目前为止,我一直使用 Rhino 作为脚本引擎。我现在想迁移到 Java 8,这也意味着我将用 Nashor
我正在寻找一种让 stub 的返回值取决于其输入的干净方法。 目前我正在使用以下方法,但效果不佳。 metadataLogic.Expect(x => x.GetMake(args.Vehicle1.
我正在设置调用构建和执行查询的方法的期望。我想询问所用参数的属性。这可能吗 using (mocks.Record()) { Expect.Call(connection.Retrieve(S
有没有人有一个使用 Rhino Mocks 和 NInject 的自动模拟容器的实现? 最佳答案 好的,我使用 Moq 集成作为起点自己构建了一个。这很简单。你需要这 3 个类: public cla
谁能告诉我为什么下面的测试没有失败? [Test] public void uhh_what() { var a = MockRepository.GenerateMock(); a.
有人可以分享下载最新版本的 Rhino 模拟二进制文件的链接吗(仅限二进制文件,我不需要源文件)?链接 http://ayende.com/projects/rhino-mocks/downloads
我最近才开始使用 Rhino-Etl对于非常简单的 ETL 过程,并取得了巨大的成功。我现在有一个稍微复杂的场景要解决,但我没有发现 ConventionInputCommandOperation 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我通常是单元测试和模拟的新手,并且正在尝试为我的一个类设置测试,我想确保从同一类中的另一个方法调用特定方法。因此,我想使用具体的实现,但要模拟它的一部分。这可能吗? 公共(public)课 MyCla
我一直在阅读有关 Rhino 的文章,认为这是一种在我的 Java 代码中实现 JavaScript 的有用方法。 在阅读了一段时间后,在 google 和这里进行了搜索,我找不到在 Java 中
我正在尝试使用 Rhino 服务总线在 1 个发布者和多个订阅者之间设置发布-订阅。然而,我似乎得到的只是竞争消费者(消息在一个消费者或另一个消费者之间分发,但不发送给两者)。 我当前的发布者配置如下
我有一个设置属性的方法 public void SetNetworkCredential(string userName, string password, string domain) {
有没有比以下 kludge 更简洁的方法来获取 Javascript 对象的 JSON 表示? System.out.println(((ScriptableObject) scope).callMe
好的,我知道 Rhino Mocks 中新的 AAA 语法存在很多混淆,但我必须说实话,从我目前所看到的来看,我喜欢。它读起来更好,并节省了一些击键。 基本上,我正在测试 ListController
我是一名优秀的程序员,十分优秀!