powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI передача по ссылке.
28 сообщений из 28, показаны все 2 страниц
RMI передача по ссылке.
    #38384477
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Возможно ли передать вложенный объект по ссылке?

Сервер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
public class MyObject {
   public void sayHello(String message){
	System.out.println(message);
   }
}

..............................

public interface ISharedObject extends Remote{
   public MyObject getMyObject() throws RemoteException;
   public void test() throws RemoteException;
}

public class SharedObject implements ISharedObject{
   MyObject myObject = new MyObject();
   
   public void test()  throws RemoteException {
        System.out.println("WORK!");
   }

   public MyObject getMyObject() throws RemoteException {
	return myObject;
   }
}

..................................
Registry registry = LocateRegistry.createRegistry(2099);
Remote stub = UnicastRemoteObject.exportObject(new SharedObject(), 0);
registry.bind("RMI_Server", stub);
..................................



Как на стороне клиента мне получить ссылку на myObject ? Возможно ли это? Или можно получить только ссылку на SharedObject? Заранее огромное спасибо!
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385155
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не поможет?
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385247
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RMI передает объекты по значению, а для этого требуется сериализация. Добавьте в объявление класса интерфейс Serializable
Код: java
1.
2.
3.
4.
5.
public class MyObject implements Serializable{
   public void sayHello(String message){
	System.out.println(message);
   }
}
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385325
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraRMI передает объекты по значению, а для этого требуется сериализация. Добавьте в объявление класса интерфейс Serializable
Код: java
1.
2.
3.
4.
5.
public class MyObject implements Serializable{
   public void sayHello(String message){
	System.out.println(message);
   }
}



Спасибо. Для меня принципиально было знать. Значит RMI мне не подходит. Нужна ссылка!
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385390
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему MyObject extends Remote не прокатит?
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385392
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385766
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПочему MyObject extends Remote не прокатит?
Нет. Не катит :(
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385769
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПример
http://stackoverflow.com/a/11187584
Как я понял из примера(беглый английский) это невозможно? Получается по ссылке только тот объект который расшарен на сервере. И если я возвращаю в качестве параметра "сложный" объект, то он должен быть сереализуемым и передается таким образом только по значению. Я прав?
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385774
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКак я понял из примера(беглый английский) это невозможно?
Вы что-то не то читаете. Там выбраный ответ помечен зеленой галочкой и содержит пример того что вы хотите.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385784
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуем документацию. Например:
http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-objmodel7.html

2.6.2 Passing Remote ObjectsWhen passing an exported remote object as a parameter or return value in a remote method call , the stub for that remote object is passed instead. Remote objects that are not exported will not be replaced with a stub instance . A remote object passed as a parameter can only implement remote interfaces.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385874
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public interface ISharedObject extends Remote{
	public IMyObject getMyObject() throws RemoteException;
}

public class SharedObject implements ISharedObject{
	MyObject myObject = new MyObject();

	public IMyObject getMyObject() throws RemoteException {
		return myObject;
	}
}

..............................

public interface IMyObject extends Remote {
	public void sayHello(String message);
}

public class MyObject implements IMyObject {
	public void sayHello(String message){
		System.out.println(message);
	}
}



Использование:
Код: java
1.
2.
3.
4.
5.
6.
7.
              try {
			Registry registry = LocateRegistry.getRegistry("localhost", 2099);
			ISharedObject service = (ISharedObject) registry.lookup("RMI_Server");
			service.getMyObject().sayHello("HEY!");
		} catch (Exception e) {
			e.printStackTrace();
		}



Выдает ошибку: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: MyObject
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385949
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel, говорят-же тебе. Поддержи Serializable.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385953
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonGorloPavel, говорят-же тебе. Поддержи Serializable.
Тогда будет by value. А задача - by reference.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385955
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм...
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385960
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может поле транзиентным объявить?
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385964
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде здесь разделе толкуют о сабж. Не?

http://stackoverflow.com/questions/11187548/is-it-possible-to-pass-by-reference-in-rmi
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385970
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно поэтому:
Во всех методах java.rmi.Remote интерфейса должно быть явно указано исключение java.rmi.RemoteException
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38385971
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВроде здесь разделе толкуют о сабж. Не?

http://stackoverflow.com/questions/11187548/is-it-possible-to-pass-by-reference-in-rmi
А здесь тогда о чем?
14789266
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386084
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraНаверно поэтому:
Во всех методах java.rmi.Remote интерфейса должно быть явно указано исключение java.rmi.RemoteException
Та же ошибка. Короче как я понял это нереально. Жаль.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386186
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelivanraНаверно поэтому:
Во всех методах java.rmi.Remote интерфейса должно быть явно указано исключение java.rmi.RemoteException
Та же ошибка. Короче как я понял это нереально. Жаль.
Если поле сделать transient, то оно не будет передаваться на клиента при сериализации. Зато сервер сможет вернуть ссылку на него через удаленный метод внешнего класса.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386203
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,
может постановка хромает?
Зачем разделяя объекты через протокол, пытаться с ними работать как с единиым целым по ссылкам?
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386530
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123GorloPavel,
может постановка хромает?
Зачем разделяя объекты через протокол, пытаться с ними работать как с единиым целым по ссылкам?
Да нет у меня другого решения. Приложение специфическое. Либо свой прокол обмена по сокетам(он уже есть) либо RMI... Видимо придется использовать второе.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386555
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelПриложение специфическое
угу.
Как всегда - нобелевское решение в архитектуре. Никто до тебя не делал.
ЗЫ.
Что сокеты, что RMI - не надо передавать Объекты и методы. Надо передавать ДАННЫЕ.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386575
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123GorloPavel,
может постановка хромает?
Зачем разделяя объекты через протокол, пытаться с ними работать как с единиым целым по ссылкам?
Можно попробовать сериализовывать физ. адрес объекта через RMI
но опять-же. Зачем? Для сравнения?

Может для идентичности ввести суррогатный PK который в рамках решаемой
задачи и будет уникальность обеспечивать.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386612
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно попробовать сериализовывать физ. адрес объекта через RMI
но опять-же. Зачем? Для сравнения?
прикольно, но очень спорно)
ЗЫ
Мы как-то в EXE, где ещё не было управляемой и перемещаемой памяти, делали такую штуку как передача адреса памяти в виде строки.
Работало)))
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386687
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю зачем автору оно надо. Разве что для работы equals. Дак переопределить правильно hashCode
оно быстро будет сравнивать даже для десериализованны объектов. Вообще равенство объектов
это вопрос философский.
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386714
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GorloPavelPetro123GorloPavel,
может постановка хромает?
Зачем разделяя объекты через протокол, пытаться с ними работать как с единиым целым по ссылкам?
Да нет у меня другого решения. Приложение специфическое. Либо свой прокол обмена по сокетам(он уже есть) либо RMI... Видимо придется использовать второе.

Не все потеряно, можно же заглушку (стаб) передавать по значению, получив его на сервере, а чтобы не делать лишнюю работу, просто следует унаследовать класс от UnicastRemoteObject - там все что нужно уже сделано:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
public interface ISharedObject<T> extends Remote {
	T getMyObject() throws RemoteException;
}
public interface IMyObject extends Remote {
	void sayHello(String message) throws RemoteException;
}
// вся магия тут:
public class MyObject extends UnicastRemoteObject implements IMyObject {
	public MyObject() throws RemoteException {
		super();
	}
	@Override
	public void sayHello(String message) throws RemoteException	{
		System.out.println(message);
	}
}
// остальное как и было, но с учетом RemoteException в конструкторе:
public class SharedObject implements ISharedObject<IMyObject> {
	private IMyObject myObject;
	public SharedObject() {
		super();
		try {
			myObject = new MyObject();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
	@Override
	public IMyObject getMyObject() throws RemoteException {
		return myObject;
	}
}
// запуск сервера
	public static void main(String[] args) throws InterruptedException, IOException {
		Registry registry = LocateRegistry.createRegistry(2099);
		Remote stub = UnicastRemoteObject.exportObject(new SharedObject(),0);
		registry.rebind("RMI_Server", stub);
		System.out.println("Press enter to exit...");
		System.in.read();
		registry = null;
		System.out.println("RMI Registry Thread have to be collected.");
	}
// клиент:
	public static void main(String[] args) throws RemoteException, NotBoundException {
		Registry registry = LocateRegistry.getRegistry(2099);
		Remote srv = registry.lookup("RMI_Server");
		ISharedObject<IMyObject> service = (ISharedObject<IMyObject>) srv;
		IMyObject myObject = service.getMyObject();
		myObject.sayHello("HEY!");
	}


Так должно работать - UnicastRemoteObject уже Serializable, плюс там есть встроенный код для получения стаба
...
Рейтинг: 0 / 0
RMI передача по ссылке.
    #38386939
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе знаю зачем автору оно надо. Разве что для работы equals. Дак переопределить правильно hashCode
оно быстро будет сравнивать даже для десериализованны объектов. Вообще равенство объектов
это вопрос философский.

Есть сервер у нему могут быть подключены к примеру два клиента. Трафик от клиента к клиенту проходит через этот сервер. Что делать если ресурсов сервера уже не хватает? Запустить еще один и раскидывать нагрузку между ними. Что делать если один клиент авторизирован на первом сервере, а второй на втором? Как их трафик соеденить? Вот тут-то я и подумал... ведь при запросе от одного клиента к другому я могу узнать на каком сервере находится второй клиент, так как оба сервера используют одну и ту же БД. Вот я и хотел обменяться ссылками между сессиями друг на друга! Для чего все это нужно? Для обхода NAT и других проблем. Сейчас это все работает в рамках одного приложения. Но клиентов уже очень много и пора подумать о расширении. Переделать архитектуру сейчас очень затруднительно и не обойдется без проблем с работой клиентов, что недопустимо в моем случае. Надеюсь ясно объяснил. :)
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI передача по ссылке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]