我的问题:我可以/应该采取什么方法在本地运行的两个或多个 JVM 实例之间进行通信?
问题的一些描述:
我正在为一个项目开发一个系统,该项目需要单独的 JVM 实例来完全隔离某些任务。
在它运行时,“父”JVM 将创建它期望执行的“子”JVM,然后将结果返回给它(以相对简单的 POJO 类的格式,或者可能是结构化的 XML 数据)。不应使用 SysErr/SysOut/SysIn 管道传输这些结果,因为子进程可能已经将它们用作其运行的一部分。
如果子 JVM 在一定时间内没有响应结果,父 JVM 应该能够向子 JVM 发出信号以停止处理,或终止子进程。否则,子 JVM 应该在完成其任务结束时正常退出。
研究至今:
我知道有许多技术可能有用,例如......
...但我很想听听其他人在选择其中一个或任何其他选项之前可能会考虑哪些方法。
感谢您对此的任何帮助或建议!
修改:
要传输的数据量-相对较小,主要是少数 POJO,其中包含表示子执行结果的字符串。如果任何解决方案在处理大量信息时效率低下,这不太可能在我的系统中成为问题。转移的金额应该是相当静态的,所以这不是必须是可扩展的。
传输延迟-在这种情况下不是一个关键问题,尽管如果需要对结果进行任何“轮询”,这应该能够相当频繁,而不会产生大量开销,因此我可以保持响应稍后在此之上的 GUI(例如进度条)
最佳答案
不是直接回答您的问题,而是对替代方案的建议。 你考虑过OSGI ?
它允许您在同一个 jvm 中完全隔离地运行 java 项目。 它的美妙之处在于项目之间的通信非常容易通过服务进行(参见 Core Specifications PDF 第 123 页)。这样就不会进行任何类型的“序列化”,因为数据和调用都在同一个 jvm 中。
此外,您对服务质量(响应时间等)的所有要求都消失了 - 您只需要担心在您想要使用服务时服务是 UP 还是 DOWN。为此,您有一个非常好的规范,称为声明式服务(参见 Enterprise Spec PDF 第 141 页)
很抱歉这个题外话,但我认为其他人可能会认为这是一个替代方案。
更新
为了回答您关于安全性的问题,我从未考虑过这种情况。我不相信有办法在 OSGI 中强制使用“内存”。
但是,有一种方法可以在 JVM 之外在不同的 OSGI 运行时之间进行通信。它被称为远程服务(参见 Enterprise Spec PDF,第 7 页)。他们还很好地讨论了在做类似事情时要考虑的因素(参见 13.1 谬误)。
Apache Felix 的人(OSGI 的实现)我认为已经用 iPOJO 实现了这个,称为 Distributed Services with iPOJO (他们的包装使使用服务更容易)。我从来没有用过这个 - 如果我错了,请忽略我。
关于java - 本地 JVM 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052102/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/