Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместное использование памяти двумя приложениями, Как это сделать? 
V
    Опции темы
Prol
Дата 11.1.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Как сделать так, чтобы данные объектов были в одном приложении, а их методы выполнялись в другом приложении? Аналогично механизму share memory во FreeBSD...

Например, в запущенном приложении Keeper есть объект 

Код

public class Point {
    public int x, y;
}

...

private Point point59 = null;
point59 = new Point;

...


В запущенном приложении Utilizateur происходят операции с объектом.

Код

public class Point {
    public int x, y;
}

...
point59.x = 112 / point59.y;
...



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

Как это сделать?

Заранее признателен за подсказку в направлении, куда копать...

PM MAIL WWW ICQ   Вверх
jManiak
Дата 11.1.2008, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



rmi?
PM MAIL ICQ   Вверх
Prol
Дата 11.1.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



rmi?

RMI сериализует/десериализует объекты, и фактически Utilizateur будет оперировать своим point59.
А нужно, чтобы Utilizateur оперировал объектом point59, который принадлежит приложению Keeper.
PM MAIL WWW ICQ   Вверх
Prol
Дата 11.1.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Например, на одной JVM на одном хосте выполняются два приложения. Может ли одно приложение получить прямой доступ к объектам другого приложения и оперировать с ними, как со своими объектами в пределах одной JVM?
PM MAIL WWW ICQ   Вверх
tux
Дата 11.1.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(Prol @  11.1.2008,  08:42 Найти цитируемый пост)
Например, на одной JVM на одном хосте выполняются два приложения. Может ли одно приложение получить прямой доступ к объектам другого приложения и оперировать с ними, как со своими объектами в пределах одной JVM? 

Может. Но для этого нужно слишком много условностей. Во-первых, объект класса нужно сделать статическим. Во-вторых, должен существовать один экземпляр класса. Хочу напомнить, что в Java возможна сложная иерархия класслоудеров и экземпляров классов может быть много, следовательно, и экземпляров статических классов тоже. Для того, чтобы был один экземпляр, в JVM должен быть только один экземпляр файла класса. Поэтому лучше поискать альтернативную возможность хранения общих данных. Например, базу данных или сериализацию на диск.
PM MAIL Skype GTalk Jabber YIM   Вверх
Prol
Дата 11.1.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(tux @ 11.1.2008,  10:38)
Поэтому лучше поискать альтернативную возможность хранения общих данных. Например, базу данных или сериализацию на диск.

Речь идёт не о хранении общих данных. Для этого достаточно СУБД. Но СУБД не хранит методы объектов, насколько я знаю, методы не сериализуются.

Смысл shared memory в данном случае в том, что выход из строя приложения Utilizateur не приведёт к потере данных, которые находятся в работающем приложении Keeper. Ведь приложение Utilizateur использует не свои объекты, а объекты (методы и данные) Keeper'a.

Вот например в SAP JVM сделано так, что разные приложения могут помещать объекты в shared memory и совместно использовать эти объекты. 
PM MAIL WWW ICQ   Вверх
LSD
Дата 11.1.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно сделать через MappedByteBuffer (правда работать с ним не удобно):
Код

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

public class ShareData
{
  public static final File FILE;

  static
  {
    File tempDir = new File(System.getProperty("java.io.tmpdir"));
    FILE = new File(tempDir, "shared_data.bin");
  }

  public static class Keeper extends Thread
  {
    private static volatile boolean working = true;

    public static void main(String[] args) throws IOException
    {
      System.out.println("Keeper started");
      RandomAccessFile in = new RandomAccessFile(FILE, "rw");
      in.setLength(8);
      FileChannel channel = in.getChannel();
      MappedByteBuffer map = channel.map(MapMode.READ_WRITE, 0, 8);
      while(working)
      {
        map.rewind();
        long value = map.getLong();
        System.out.println("value = " + value);
        try
        {
          Thread.sleep(500);
        }
        catch(InterruptedException e)
        {
        }
      }
      channel.close();
      in.close();
      System.out.println("Keeper stopped");
    }

    @Override
    public void run()
    {
      working = false;
      try
      {
        Thread.sleep(1000);
      }
      catch(InterruptedException e)
      {
      }
    }
  }

  public static class Utilizateur extends Thread
  {
    private static volatile boolean working = true;

    public static void main(String[] args) throws IOException
    {
      System.out.println("Utilizateur started");
      RandomAccessFile in = new RandomAccessFile(FILE, "rw");
      in.setLength(8);
      FileChannel channel = in.getChannel();
      MappedByteBuffer map = channel.map(MapMode.READ_WRITE, 0, 8);
      while(working)
      {
        map.rewind();
        map.putLong(System.currentTimeMillis());
        try
        {
          Thread.sleep(100);
        }
        catch(InterruptedException e)
        {
        }
      }
      channel.close();
      in.close();
      System.out.println("Utilizateur stopped");
    }

    @Override
    public void run()
    {
      working = false;
      try
      {
        Thread.sleep(1000);
      }
      catch(InterruptedException e)
      {
      }
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 11.1.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



LSD, шарить нужно не данные, а объекты :о)
Из вашего кода я не понял, как Утилизатор сможет пользоваться объектами Кипера.
PM MAIL WWW ICQ   Вверх
Prol
Дата 11.1.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Попробую переформулировать на живом работающем примере на С.

Запускаю:

prol@corphangar> CorporationApplication -Keeper

Приложение запускается, распределяет память и остаётся в режиме кипера, ничего не делает.

Запускаю вторую копию этого же приложения

prol@corphangar> CorporationApplication -Utilizateur

С помощью механизма shm второе приложение работает над данными первого приложения с помощью функций первого приложения, в том числе делает new и dispose, новые объекты создаются и удаляются в общей shared memory, и первое приложение, которое ничего не делает в sleep'e, при этом владеет всеми новыми объектами.

Так как первое приложение ничего не делает, то оно и не падает. А вот если второе приложение свалится по какой-либо причине, то в первом приложении останутся все данные целыми. :о)

Как сделать такое на Java? 
Чтобы второе приложение использовало объекты первого приложения?




PM MAIL WWW ICQ   Вверх
LSD
Дата 11.1.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Объекты шарить между разными JVM - нельзя (во всяком случае стандартные реализации этого не позволяют).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 11.1.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(LSD @ 11.1.2008,  12:43)
Объекты шарить между разными JVM - нельзя (во всяком случае стандартные реализации этого не позволяют).

А можно ли шарить объекты между приложениями внутри одной JVM?
PM MAIL WWW ICQ   Вверх
LSD
Дата 11.1.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Prol @  11.1.2008,  12:51 Найти цитируемый пост)
А можно ли шарить объекты между приложениями внутри одной JVM?

Да, только они должны использовать один и тот же класс лоадер.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 11.1.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(LSD @ 11.1.2008,  12:59)
Да, только они должны использовать один и тот же класс лоадер.

Извините, я ещё не владею достеменно понятиями Java, поэтому объясните, как в одной JVM могут быть разные класслоадеры.

И пожалуйста, приведите пример, как два приложения могут пользоваться одним объектом в одной JVM в виде кусочка кода...
PM MAIL WWW ICQ   Вверх
LSD
Дата 11.1.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Prol @  11.1.2008,  13:25 Найти цитируемый пост)
Извините, я ещё не владею достеменно понятиями Java, поэтому объясните, как в одной JVM могут быть разные класслоадеры.

Очень даже запросто, если это какой-то  J2EE сервер, то они даже будут разными. Но в обычном приложении он как правило один.


Цитата(Prol @  11.1.2008,  13:25 Найти цитируемый пост)
И пожалуйста, приведите пример, как два приложения могут пользоваться одним объектом в одной JVM в виде кусочка кода... 

Да обычный синглетон например:
Код

Runtime.getRuntime()

все потоки используют один и тот же экземпляр Runtime.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 11.1.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(LSD @ 11.1.2008,  13:36)
Цитата(Prol @  11.1.2008,  13:25 Найти цитируемый пост)
И пожалуйста, приведите пример, как два приложения могут пользоваться одним объектом в одной JVM в виде кусочка кода... 

Да обычный синглетон например:
Код

Runtime.getRuntime()

все потоки используют один и тот же экземпляр Runtime.

Как самому сделать такой "синглетон", одни объект, который могут использовать одновременно два моих приложения?
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1265 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.