我需要在两个不同的 JAVA 程序之间具有远程方法调用 (RMI) 功能。两者都应该按顺序对给定文件(文件名作为参数)执行一些后端功能。由于要处理的文件数量可能太大,我要求远程调用异步完成。最初我为此使用了 Java RMI,因为它非常适合,只是调用是同步完成的。这些是简单的 java 程序,我不想将它们部署在任何应用程序服务器上,因为这会产生太多开销。还需要同时执行多个文件,因此程序是在线程安全模式下开发的。请为此建议理想的实现。任何定制开发的 API(如果免费提供)都会非常有帮助。
6 回答
I need to have Remote Method invocation (RMI) functionality between two different JAVA programs ... I require that the Remote Call to be done asynchronously.
Those two requirements are mutually contradictory. RMI means Remote Method Invocation, which implies call-and-return method call semantics. If it isn't call-and-return, it isn't method invocation, so it isn't RMI either.
You should investigate technologies that have listeners, such as JMS.
进行真正的异步调用的方法是:
- 使用 NIO 实现 RMI。
- 当代理被调用时,将请求放在 NIO 选择器上,并立即将结果未来返回给调用者。
- 每个请求都必须有一个唯一的请求 id,当具有该 id 的响应从服务器到达时,应该解决正确的未来。
我只知道这种异步 RMI的一种实现
这是一个关于它如何实际实现的序列图的很好的解释。
最简单的解决方案是让您的 RMI 调用启动一个异步任务。如果您想提高效率,您可以发送批量文件进行处理。注意:除非您小心,否则磁盘子系统可能是您的瓶颈,并且使用多个线程可能会更慢而不是更快。
如果您确定您的两个应用程序都使用 Java(并且将要使用),那么您应该使用 JMS(Java 消息传递服务)。异步通信也将有一个第 3 方代理 - 一个消息队列(ActiveMQ 或直接嵌入在 Glassfish 或其他应用程序服务器中的一个)。
通过使用它,您发送 MQ 并将消息发送到其他应用程序。
如果您想要更大的灵活性,并且可能某些应用程序正在(或将要)用另一种语言编写,您可能应该使用 AMQP 而不是 JMS。
只需启动一个线程并使用该线程调用该方法。现在你有了异步 RMI ;-)