Java: Сильная мобильность кода Как? - PullRequest
6 голосов
/ 17 ноября 2009

Кто-нибудь знает, как использовать Java для Сильной мобильности кода ? Вы когда-нибудь делали это раньше?

Вот что я пытаюсь достичь.

Предположим, у нас есть 2 отдельных приложения Java, которые обмениваются данными по сети. Приложение A и Приложение B.

Приложение A имеет класс x, созданный как объект, и использует его. Приложение B не имеет предварительных знаний об этом классе x.

Приложение A должно перенести экземпляр класса x в приложение B. Приложение B должно иметь возможность динамически загружать класс x и сохраняет состояние класса x.

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

Любые указатели были бы очень полезны, и спасибо заранее!

ПРИМЕЧАНИЕ: Меня больше всего интересует как (т.е. подход, способ мышления) решить эту проблему, а не что используется для решения этот; это потому, что мне поручено придумать собственное решение для решения этой проблемы. Хотя указывать на библиотеки / фреймворк - это здорово, было бы идеально, если бы ответы отправлялись людьми, которые уже делали что-то подобное (хотя и редко).

Ответы [ 6 ]

2 голосов
/ 17 ноября 2009

Вы спрашиваете о сильной мобильности, но ваши требования выполняются при слабой мобильности, что с некоторыми ограничениями обеспечивается протоколом RMI. RMI поддерживает не только RPC, сериализацию объектов и графы распределенных объектов, но и совместное использование кода, обычно используемое для того, чтобы клиент мог загрузить байт-код классов, известных только серверу, и выполнить этот байт-код локально.

Сильная мобильность не поддерживается Java, и я не могу придумать, как реализовать ее, не создавая проприетарные расширения для виртуальной машины. По сути, сильная мобильность в контексте Java будет означать, что вы приостанавливаете или приостанавливаете поток в одной виртуальной машине, переносите все экземпляры объектов, достижимые из этого потока, потенциально байт-код, необходимый для выполнения, и внутренний поток st (стек вызовов и т. Д.) В другой виртуальной машины и заставить ее воссоздать состояние потока и продолжить выполнение в точке, где поток был приостановлен в исходной виртуальной машине.

1 голос
/ 21 февраля 2012

Я написал библиотеку с открытым исходным кодом, которая поддерживает Code Mobility в точности так, как указано выше. На самом деле он также поддерживает использование RPC-типа.

См .: Mobility-RPC - бесшовная мобильность кода и RPC для платформы Java

С точки зрения слабой и сильной подвижности: в середине .

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

0 голосов
/ 17 ноября 2009

Чтобы переместить экземпляр I класса C. вам нужно ДВУХ вещей, переместившихся из A в B

Сначала определение класса C (обычно в форме списка байтовых кодов), а затем сериализованная форма I. Обратите внимание, что вы должны использовать сериализацию XML вместо старой двоичной сериализации.

Действительно сложная часть - это передача зависимостей C, так как вам необходимо по существу перенести также все суперклассы C, плюс все возвращаемые типы и типы полей, а также суперклассы THEIR и типы возврата / поля. и т. д. и т. д.

Если вам действительно нужно сделать это для всех возможных значений C, лучше всего использовать каркас, разработанный для этого, например, сетку или терракоту. Если вы можете сдерживать себя, например, заданный и узкий интерфейс, вы, вероятно, будете намного лучше. Также подумайте только об использовании свойств для этого, поскольку они очень просты и могут помочь вам далеко.

0 голосов
/ 17 ноября 2009

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

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

Затем, когда он внедряется в ваш класс, вы устанавливаете свойства в этой точке.

У них должен быть известный интерфейс. Должен быть контракт, от которого могут зависеть оба.

Я не пробовал это, и я не думаю, что Java - правильный язык для этого. Если вам нужна эта функциональность, вы можете захотеть взглянуть на что-то вроде одного из языков сценариев jvm или Clojure, так как я ожидаю, что он также будет работать с этим, и затем ваше java-приложение будет взаимодействовать с этой другой динамической средой, как это было бы все будут работать на JVM.

UPDATE:

Вот ссылка на компиляцию на лету, с JDK5, с которой многие люди могут быть не знакомы.

http://fivedots.coe.psu.ac.th/~ad/jg/javaArt1/index.html

0 голосов
/ 17 ноября 2009

В обычной Java вам потребуется какой-то способ, чтобы приложение B загружало класс для объекта, а затем вам нужно сериализовать объект из приложения A в приложение B. Возможно, вы могли бы сделать это, если классы доступны в какое-то центральное расположение, такое как HTTP-сервер. Но в общем случае, когда вы хотите перенести совершенно новый объект в приложение B, вам нужно реализовать собственный загрузчик классов (или найти библиотеку, которая делает это).

Если все ваши объекты являются Serializable, и у вас есть центральное место для хранения классов, это должно быть довольно просто реализовать. Вы можете использовать URLClassLoader для загрузки классов с http-сервера, затем обычную сериализацию Java для передачи через сериализованный объект. Потребовалась бы некоторая координация между Приложениями A и B, чтобы B знал, какой класс загрузить, и A знал, когда отправлять объект, а B знал, как продолжить выполнение методов объекта. При таком подходе, вероятно, объект X не сможет выполнить метод; он должен был бы остановить и затем возобновить его выполнение в сотрудничестве с Приложением A.

0 голосов
/ 17 ноября 2009

Существует проект под названием cajo , который может динамически перемещать объекты по сети. Я не уверен насчет состояния выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...