2

我需要在两个不同的 JAVA 程序之间具有远程方法调用 (RMI) 功能。两者都应该按顺序对给定文件(文件名作为参数)执行一些后端功能。由于要处理的文件数量可能太大,我要求远程调用异步完成。最初我为此使用了 Java RMI,因为它非常适合,只是调用是同步完成的。这些是简单的 java 程序,我不想将它们部署在任何应用程序服务器上,因为这会产生太多开销。还需要同时执行多个文件,因此程序是在线程安全模式下开发的。请为此建议理想的实现。任何定制开发的 API(如果免费提供)都会非常有帮助。

4

6 回答 6

2

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.

于 2013-04-11T10:26:24.727 回答
2

进行真正的异步调用的方法是:

  1. 使用 NIO 实现 RMI。
  2. 当代理被调用时,将请求放在 NIO 选择器上,并立即将结果未来返回给调用者。
  3. 每个请求都必须有一个唯一的请求 id,当具有该 id 的响应从服务器到达时,应该解决正确的未来。

我只知道这种异步 RMI的一种实现

这是一个关于它如何实际实现的序列图的很好的解释。

于 2014-11-21T20:33:18.733 回答
1

最简单的解决方案是让您的 RMI 调用启动一个异步任务。如果您想提高效率,您可以发送批量文件进行处理。注意:除非您小心,否则磁盘子系统可能是您的瓶颈,并且使用多个线程可能会更慢而不是更快。

于 2013-04-11T07:22:37.467 回答
0

如果您确定您的两个应用程序都使用 Java(并且将要使用),那么您应该使用 JMS(Java 消息传递服务)。异步通信也将有一个第 3 方代理 - 一个消息队列(ActiveMQ 或直接嵌入在 Glassfish 或其他应用程序服务器中的一个)。

通过使用它,您发送 MQ 并将消息发送到其他应用程序。

如果您想要更大的灵活性,并且可能某些应用程序正在(或将要)用另一种语言编写,您可能应该使用 AMQP 而不是 JMS。

于 2013-04-11T07:11:21.057 回答
0

这是 RMI 领域的另一个支持异步执行的新播放器。Redisson框架。更多关于异步执行的文档在这里

于 2016-06-04T08:30:43.697 回答
-1

只需启动一个线程并使用该线程调用该方法。现在你有了异步 RMI ;-)

于 2014-08-08T15:24:31.057 回答