powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB Local and Remote
25 сообщений из 29, страница 1 из 2
EJB Local and Remote
    #38030195
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно есть два ejb-модуля, которые должны общаться между собой.
На первом модуле есть Statefull с данными
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Local
public interface DataLocal{
    /*obj - точно несериализуемые данные*/
    public void init(Object obj);
}
@Remote
public interface DataRemote {
    public String getValue(String key);
}



На втором модуле собственно обработчик этих данных (Stateless)
Код: java
1.
2.
3.
4.
@Remote
public interface Worker {
    public void invoke(DataRemote data);
}



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

Как это сделать?
Т.е. если я получу ссылку на Local, то она не будет является Remote и соответственно он будет пытаться ее сериализовать.
Если я получу ссылку на Remote, то она не будет являться Local.

P.S. Просьба идеи по спецификации, как это сделать через одно место я знаю :)
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030207
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая-то запутанная постановка вопроса.
- Один бин может реализовывать как Local так и Remote интерфейсы.
- Local так и Remote интерфейсы бина могут отличатся.
С чем конкретно сложности?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030216
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

DataLocal local = ctx.lookup("...");
local.init(...);
DataRemote remote = ctx.lookup("...");
worker.invoke(remote);

но вот к сожалению remote и local смотрят на разные инстансы - соответственно remote ничего про данные из init не знает
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030227
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это специфика Statefull.
Можно сделать
Код: java
1.
interface DataLocal extends DataRemote 
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030235
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

А это не спасает.
DataLocal local = ctx.lookup('...');
выдает ссылку на proxy, которая не является Remote интерфейсом (т.е. она его имплементит, но не будет ejb remote), а соответственно при вызове invoke(local) будет попытка сериализации этого прокси - и все сломается
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030249
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgareА это не спасает.
DataLocal local = ctx.lookup('...');
выдает ссылку на proxy, которая не является Remote интерфейсом (т.е. она его имплементит, но не будет ejb remote), а соответственно при вызове invoke(local) будет попытка сериализации этого прокси - и все сломается
Вы в удаленном бине ссылку на Local получаете??? Откуда там прокси? При локальном лукапе должна быть простая ссылка на локальный бин. Для этого ведь локальный интерфейс и придуман, чтобы избежать потерь при сериализации.
Объясните конкретно, где удаленный клиент. Где локальный клиент. Удаленному клиенту локальный интерфейс? Зачем им один и тот же бин это если Stateful и у них разные ссылки вообще?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030292
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Это собственно код клиента
Код: java
1.
2.
3.
4.
5.
6.
7.
DataLocal local = ctx.lookup("java:module/data!com.DataLocal");
//local instanceof Proxy - true
local.init(..);
DataRemote remote = ctx.lookup("data/remote");
//Здесь remote и local смотрят на два разных объекта
Worker work= ctx.lookup("worker/remote");
work.invoke(remote);



в случае DataLocal extends DataRemote

Код: java
1.
2.
3.
4.
5.
DataLocal local = ctx.lookup("java:module/data!com.DataLocal");
//local instanceof Proxy - true
local.init(..);
Worker work= ctx.lookup("worker/remote");
work.invoke((DataRemote)local);



получаем
execution fail: javax.ejb.EJBException: java.rmi.MarshalException: CORBA BAD_PARAM 1398079494 Maybe;
nested exception is: java.io.NotSerializableException: WARNING: IOP00100006: Class сom.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate is not Serializable
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030333
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш клиент, это что? EJB на этом же сервере? EJB на другом сервере или standalone приложение?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030338
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой клиент - это ejb компонент, расположенный на том же или соседнем сревере (я бы размышлял про соседний).
Т.е. он клиент в решении данной задачи, а еще он же является серверным компонентом в рамках более широкой.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030343
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле мой клиент должен выступать как клиент для Worker-а и как сервер, предоставляющий этому Worker-у доступ к Data, через DataRemote.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030357
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgareМой клиент - это ejb компонент, расположенный на том же или соседнем сревере (я бы размышлял про соседний).
Тогда о каком вообще локальном интерфейсе речь? Локальные вызовы работают исключительно в одной JVM.
Выходит вам таки нужен
DataRemote extends DataLocal
Т.к. в основном вы используете только Remote интерфейс, и в исключительно редких случаях Local.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030359
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgare,

А, так вы передаете ссылку на EJB, при чем remote, в качестве параметра другому EJB. Так нельзя делать.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030365
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз - для того, чтобы DataRemote можно было передать Worker-у его надо проинициализировать - собственно в этом и вопрос - как сделать инициализацию Data перед тем как отдать его Worker-у? Проинициализировать через методы DataRemote нельзя - а как можно?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030371
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инициализация это часть life cycle.
Открываем туториал и смотрим
http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html
PostContruct, PostActivate, init, ejbCreate
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030372
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgareЕще раз - для того, чтобы DataRemote можно было передать Worker-у его надо проинициализировать - собственно в этом и вопрос - как сделать инициализацию Data перед тем как отдать его Worker-у? Проинициализировать через методы DataRemote нельзя - а как можно?

Так получите ссылку в вашем Worker на DataRemote через аннотацию @EJB. И в методе @PostConstruct бина Worker вызовите DataRemote.init(...)
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030379
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wessen,

Как это нельзя?

Если инициализацию сделать сериализуемой, т.е.
DataRemote{
init(...)
get(...)
}
то я прекрасно смогу создать Statefull на DataRemote проинициализировать его и передать в Worker в виде remote-интерфейса.
Проблема, что мне надо его проинициализировать не через rmi.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030423
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут http://www.theserverside.com/discussions/thread.tss?thread_id=16226 человек хотел такого же. Только я не понял, получилось ли у него.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030425
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааа...
Удаленный клиент посылает серверу ссылку на Remote интерфейс, а сервер должен по ней найти Local интерфейс, т.к. бин находится в его JVM? Так?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030457
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczАаа...
Удаленный клиент посылает серверу ссылку на Remote интерфейс, а сервер должен по ней найти Local интерфейс, т.к. бин находится в его JVM? Так?
Если да, то возникает резонный вопрос, а нафига так. Сделайте вызов на Remote интерфейса, который поместит себя в Worker. Зачем Worker вызывать удаленно?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030466
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Удаленный клиент посылает серверу ссылку на Remote интерфейс
Да

>а сервер должен по ней найти Local интерфейс
Нет, посылается ссылка на Remote интерфейс бина, который должен содержать данные, которые непонятно как в него положить

>Зачем Worker вызывать удаленно?
Ну затем, что Worker-а нет на этом сервере.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030485
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgare>а сервер должен по ней найти Local интерфейс
Нет, посылается ссылка на Remote интерфейс бина, который должен содержать данные, которые непонятно как в него положить
ОК. Есть удаленный клиент, которому нужно положить несереализуемые данные в удаленный бин. Нет ли тут противоречия в том что всё происходит удаленное, но данные не сериализуются.

bolgare>Зачем Worker вызывать удаленно?
Ну затем, что Worker-а нет на этом сервере.
Ну, так пусть бин сам найдёт и вызовет Worker, если они на одном серверве. И перестанте называть оба ваших "сервера" серверами, потому что в контексте вашей задачи один из них "клиент". А вы постоянно вносите этим путаницу. Нарисуйте или объясните нормально где находятся все три стороны: бин, клиент, worker
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030705
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А есть у кого-нибудь более светлые идеи, чем у Blazkowicz?
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030726
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bolgareА есть у кого-нибудь более светлые идеи, чем у Blazkowicz?
Остальным влом разбираться в невнятно сформированом вопросе: "есть сервер и сервер, local и remote, надо передать в worker, но не сериализуется". Объяснил бы четко кто где находится, почему нельзя сделать ни так, ни эдак. Может и желающие подтянулись бы.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030742
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересует вторая часть, а именно
bolgare
Код: java
1.
2.
3.
4.
@Remote
public interface Worker {
    public void invoke(DataRemote data);
}



P.S. Просьба идеи по спецификации, как это сделать через одно место я знаю :)


Раз Вы написали что знаете как это сделать через одно место, то как? Как передать data на сервер, по сути то что имеет смысл только на конкректном клиенте.
...
Рейтинг: 0 / 0
EJB Local and Remote
    #38030827
bolgare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через одно место - это совсем не по спеке, а именно.
Data{
public static Map<ID, Data> map;
ID id;
public Data(){
id = глобально уникальный
map.put(id, this);
}
}

Собственно вызов:
DataRemote remote = ctx.lookup();
while(!Data.map.contains(remote.getId()) - запрашиваем новый remote

на выходе соответственно всегда имеем инстанс Data в нашем map и Remote на него, а соответственно делаем что хотим
можем конечно свалиться в вечный цикл, но с вероятностью 99% этого не произойдет, да можно еще подумать и корректно обработать
но такое решение юзать в продакшене совсем не хочется :(
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB Local and Remote
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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