Как разделить объект между Java-приложениями? - PullRequest
8 голосов
/ 14 июля 2010

У меня одновременно работают 2 отдельных приложения Java. (Два отдельных javaw.exe) Мне нужно разделить объект между ними, пока они работают.

Какой самый простой способ добиться этого без постоянного хранения?

Ответы [ 6 ]

8 голосов
/ 14 июля 2010

Объекты и их переменные экземпляра могут совместно использоваться потоками в Java-программе, что является довольно простой задачей.
Если вам требуется разделить объекты (экземпляры) между двумя программами без хранения данных, следующий выбор будетиспользовать RMI Socket Communication или службу сообщений Java.

3 голосов
/ 14 июля 2010

Вы можете использовать TCP

  1. Использовать локальный программный порт, скажем, localhost: 999.
  2. Сделать одно приложение в качестве сервера (прослушивая этот порт), а другое - в качестве клиента (будетподключиться к серверу по адресу localhost: 999, но для своего использования будет использовать другой порт).
  3. Клиент сериализует ваш объект в поток.
  4. Сервер десериализован!

Пример: http://www.java -samples.com / showtutorial.php? Tutorialid = 1167

2 голосов
/ 02 января 2015

Я думаю, что Hazelcast отлично работает для такого типа ситуаций.Это практически не требует настройки (более того, вам нужно добавить зависимости в jar Hazelcast).В следующем примере кода показано, как настроить общую Map.

// Code in process 1
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<Integer, String> sharedData = instance.getMap("shared");
sharedData.put(1, "This is shared data");

// Code in process 2
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<Integer, String> sharedData = instance.getMap("shared");
String theSharedString = sharedData.get(1);

Hazelcast для поддержки различных общих структур данных, включая Map, Queue, List, AtomicLong, IdGenerator и т. Д.. Документация хорошая и, по моему опыту, реализация надежная.

2 голосов
/ 14 июля 2010

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

В первом случае вам придется поделиться «удаленной ссылкой» на некоторый объект. RMI - хороший подход.

Во втором случае вам нужно только сериализовать объект, которым вы хотите поделиться, и отправить его.Вы можете отправить его сериализованным (преобразованным в байты) через сокет как Анкит сказал или даже можете использовать:

  • RMI :) Отправитель подключается к зарегистрированному RMIПолучатель, вызывает метод с объектом mesasge в качестве параметра и забывает об объекте RMI

  • Служба обмена сообщениями Java (JMS), возможно, перерасход ...

  • какая-то другая креативная, но простая вещь ...

1 голос
/ 14 июля 2010

Если вы не можете сохранить объект постоянно, вам нужно как-то передать его. Это можно сделать либо через сеть, либо через какую-то общую память.

Для первого (сетевого) подхода используйте сериализацию (java.io.Serializable) и перенесите объект через сокет. Это потребует написания слушателей сокетов.

Второй подход потребует использования и настройки сторонней библиотеки (например, EHCache ).

0 голосов
/ 14 июля 2010

Возможно Oracle Coherence ?Это работает как карта памяти, совместно используемая приложениями.

...