RMI loopback: та же тема? - PullRequest
1 голос
/ 10 ноября 2011

Если поток jack на хосте A вызывает метод RMI foo на хосте B, и в этом методе хост B вызывает метод bar на хосте A, bar будет выполняться потоком jack?

Я предполагаю, что это будет другой поток, но я думаю, что это может быть теоретически возможно.

Почему кто-то захочет этого?Блокировка повторного входа, например, была бы удобной функцией.

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

3.2 Использование потока в вызовах удаленных методов

Метод, отправленный средой выполнения RMI для реализации удаленного объекта, может выполняться или не выполняться в отдельном потоке.Среда выполнения RMI не дает никаких гарантий относительно отображения вызовов удаленных объектов в потоки.Поскольку удаленный вызов метода для одного и того же удаленного объекта может выполняться одновременно, реализация удаленного объекта должна убедиться, что его реализация является поточно-ориентированной.

From http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmi-arch3.html

Итак, явноэто говорит о том, что исходный вызывающий поток, 'jack', не указан для привязки к удаленному вызову, и поэтому не может быть никакой гарантии относительно потока, используемого сервером RMI на 'A' при обработке barcall.

И, как говорит Томас, jack уже блокируется, он никогда не сможет обработать удаленный вызов из 'B'.

2 голосов
/ 10 ноября 2011

Краткий ответ: это будет другая тема наверняка.

Длинный: подумай об этом. Когда jack @ A host вызывает foo() @ B host, поток jack @ A блокируется в ожидании ответа foo(). Поэтому, когда foo() @ B вызывает bar() @ A, jack @ A гарантированно будет все еще ждать, следовательно, bar() не будет обработан им.

Также обратите внимание, что существует отдельный пул потоков для обработки вызовов клиента RMI на стороне сервера. Поэтому, скорее всего, ваш поток jack на самом деле является потоком приложения, и RMI не имеет к нему доступа. Если вызов foo() @ B с помощью jack потока также не был инициирован внешним вызовом RMI (слишком много обратных вызовов, паника ).

0 голосов
/ 10 ноября 2011

Ну, потоки живут внутри процессов ОС. Итак, если у вас разные JVM, по определению они будут разными фактическими потоками. Поток может жить только на одной машине. Но каждый поток будет ждать завершения каждого вызова RMI, поэтому может показаться, что это один поток.

...