Совместное использование объектов через процессы Java - PullRequest
8 голосов
/ 17 сентября 2009

Я выполняю другую JVM (java.exe) из основного приложения. Есть ли способ поделиться объектом (довольно крупным объектом) с вновь созданным процессом (во время создания или после того, как он был создан).

someObject sO= new someObject();

//sO is populated

//Creating new process

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("java  -cp " + tempDir +  jarsInPath  + " " + appMain);

Теперь я хочу, чтобы объект sO был доступен для процесса, обозначенного объектом proc

Предоставляет ли ProcessBuilder какие-либо утилиты для этой цели?

Ответы [ 4 ]

3 голосов
/ 17 сентября 2009

Если вы хотите поделиться объектами, лучше всего использовать потоки вместо отдельного процесса. Процессы не могут совместно использовать память (кроме как через JNI), поэтому вам придется копировать большой объект туда и обратно в сериализованном виде, либо через файлы, либо через соединение через RMI-сокет (последний вариант является лучшим вариантом, поскольку он приводит к внутренней синхронизации) .

1 голос
/ 17 сентября 2009

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

Вы не говорите, почему это отдельные процессы. Есть ли у вас возможность загрузить код вашего дочернего процесса прямо в родительский процесс? Возможна динамическая загрузка и выгрузка.

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

Я думаю, вы можете использовать распределенные кэши для этих целей (EHCache, memcached и т. Д.)

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

Нет, в Java нет поддержки разделяемой памяти.

Самый простой способ решить эту проблему - сериализовать объект во временный файл и затем десериализовать его обратно в новой JVM.

...