2013-04-11 3 views
1

Мне нужно иметь функцию удаленного вызова метода (RMI) между двумя различными программами JAVA. Предполагается, что оба из них будут выполнять некоторые функциональные возможности по заданному файлу (имя файла как параметр) последовательно. Поскольку количество обрабатываемых файлов может быть слишком большим, я требую, чтобы удаленный вызов выполнялся асинхронно. Первоначально я использовал Java RMI для этого, поскольку он идеально подходит, за исключением того, что вызов выполняется синхронно. Это простые java-программы, и я не хочу их разворачивать на любом сервере приложений, так как это слишком много накладных расходов. Также необходимо одновременно запускать несколько файлов, поэтому программа разрабатывается в потокобезопасном режиме. Пожалуйста, предложите идеальную реализацию для этого. Любой специально разработанный API, если он доступен бесплатно, будет действительно полезен.JAVA асинхронный RMI

ответ

1

Самое простое решение состоит в том, чтобы ваш вызов RMI начинал асинхронную задачу. Если вы хотите повысить эффективность, вы можете отправить партии файлов для обработки. Примечание: если вы не будете осторожны, дисковая подсистема может быть вашим узким местом, и использование нескольких потоков может быть медленнее, а не быстрее.

0

Вы должны использовать JMS (Java Messaging Service), если вы уверены, что ваши приложения находятся на Java (и они будут). В асинхронной связи также будет сторонний брокер - очередь сообщений (ActiveMQ или одна, встроенная непосредственно в сервер приложений, например, Glassfish или другие).

С помощью этого вы отправляете MQ и отправляет сообщения другому приложению.

Если вам нужна большая гибкость, и, возможно, некоторые из приложений (или должны быть) записаны на другом языке, вы, вероятно, должны использовать AMQP вместо JMS.

3

Мне нужно иметь функцию удаленного вызова метода (RMI) между двумя различными программами JAVA ... Мне требуется, чтобы удаленный вызов выполнялся асинхронно.

Эти два требования являются взаимно противоречивыми. RMI означает метод удаленного вызова метода, который подразумевает семантику вызова метода call-and-return. Если это не call-and-return, это не вызов метода, поэтому он также не RMI.

Вы должны исследовать технологии, в которых есть слушатели, такие как JMS.

+2

На самом деле это не так. Асинхронные вызовы методов обычно используют обратные вызовы или некоторую другую форму продолжения для обработки их возвращаемых значений. Обычно они не срабатывают и не забываются, как асинхронное сообщение, и не похожи на отправку сообщений в актерской системе, в результате чего вам необходимо явно прослушивать ответы. –

+0

@BarryKelly Конечно, но речь идет о Java RMI, который не имеет такой функции. – EJP

-1

Просто прокрутите поток и вызовите метод из потока. Теперь у вас есть асинхронная RMI ;-)

2

Пути иметь истинный асинхронный вызов заключается в следующем:

  1. Реализация RMI с NIO.
  2. Когда прокси-сервер вызывается, поместите запрос в селектор NIO и немедленно верните результат в будущее вызывающему.
  3. Каждый запрос должен иметь уникальный идентификатор запроса, и когда ответ с этим идентификатором поступает с сервера, должно быть разрешено правильное будущее.

Существует только одна реализация, что я знаю, такой async RMI

Вот хороший explanation с диаграммы последовательности о том, как она на самом деле реализована.

0

Вот еще один новый игрок в области RMI, который поддерживает асинхронное выполнение. Структура Redisson. Дополнительная документация об асинхронном выполнении - here.