2009-11-17 2 views
6

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

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

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

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

приложение А требуется, чтобы перенести экземпляр класса х к App B. App B должен быть в состоянии динамически загружать класса х, и сохраняет состояние класса х.

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

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

Примечание: Я в основном заинтересованы в как (т.е. подход, способ думать) эта проблема решена, не , что используется для решения этой проблемы; это потому, что мне поручено разработать собственное решение для решения этой проблемы. Хотя указание библиотек/рамок велико, было бы идеально, если бы ответы были опубликованы от людей, которые раньше делали что-то подобное (как бы редко).

+0

Звучит интересно! Если бы я был вообще проинформирован об этой теме, я бы опубликовал это как ответ, но вместо этого отправлю его как комментарий. Не могли бы вы перенести объект, сначала отправив определение класса Serialized, загрузив его в сборку, а затем отправив фактический объект и загрузив его, затем используя определение класса (посмотрите на отражение, если вы этого не сделали). Это было бы довольно friggen cooL! – Zoidberg

+0

Я удалил свой ответ, как ясный, что я должен что-то прочитать, прежде чем убежать на губе. Тем не менее, я считаю, что есть случай для упрощенного проектирования движущихся данных, а не кода. Однако, если вы действительно выполняете распределенные критически важные операции, тогда мобильность кода может быть идеальной. – Cliff

ответ

0

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

0

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

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

2

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

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

-2

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

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

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

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

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

UPDATE:

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

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

0

Вам нужно две вещи, переданные от А к В, чтобы переместить экземпляр я из класса C.

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

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

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

1

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

См: Mobility-RPC - Seamless Code Mobility and RPC for the Java platform

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

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