|
|
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Собственно есть два ejb-модуля, которые должны общаться между собой. На первом модуле есть Statefull с данными Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. На втором модуле собственно обработчик этих данных (Stateless) Код: java 1. 2. 3. 4. Хочется - я биру бин, точнее его Local, записываю в него данные (повторюсь, они не сериализуются никак), а дальше этот бин, т.е. его Remote хочу отрпавить на другой модуль. Как это сделать? Т.е. если я получу ссылку на Local, то она не будет является Remote и соответственно он будет пытаться ее сериализовать. Если я получу ссылку на Remote, то она не будет являться Local. P.S. Просьба идеи по спецификации, как это сделать через одно место я знаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 13:46:12 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Какая-то запутанная постановка вопроса. - Один бин может реализовывать как Local так и Remote интерфейсы. - Local так и Remote интерфейсы бина могут отличатся. С чем конкретно сложности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 13:52:13 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, DataLocal local = ctx.lookup("..."); local.init(...); DataRemote remote = ctx.lookup("..."); worker.invoke(remote); но вот к сожалению remote и local смотрят на разные инстансы - соответственно remote ничего про данные из init не знает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 13:55:31 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Это специфика Statefull. Можно сделать Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:00:48 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А это не спасает. DataLocal local = ctx.lookup('...'); выдает ссылку на proxy, которая не является Remote интерфейсом (т.е. она его имплементит, но не будет ejb remote), а соответственно при вызове invoke(local) будет попытка сериализации этого прокси - и все сломается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:03:26 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgareА это не спасает. DataLocal local = ctx.lookup('...'); выдает ссылку на proxy, которая не является Remote интерфейсом (т.е. она его имплементит, но не будет ejb remote), а соответственно при вызове invoke(local) будет попытка сериализации этого прокси - и все сломается Вы в удаленном бине ссылку на Local получаете??? Откуда там прокси? При локальном лукапе должна быть простая ссылка на локальный бин. Для этого ведь локальный интерфейс и придуман, чтобы избежать потерь при сериализации. Объясните конкретно, где удаленный клиент. Где локальный клиент. Удаленному клиенту локальный интерфейс? Зачем им один и тот же бин это если Stateful и у них разные ссылки вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:10:09 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Это собственно код клиента Код: java 1. 2. 3. 4. 5. 6. 7. в случае DataLocal extends DataRemote Код: java 1. 2. 3. 4. 5. получаем 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:27:35 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Ваш клиент, это что? EJB на этом же сервере? EJB на другом сервере или standalone приложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:44:31 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Мой клиент - это ejb компонент, расположенный на том же или соседнем сревере (я бы размышлял про соседний). Т.е. он клиент в решении данной задачи, а еще он же является серверным компонентом в рамках более широкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:48:38 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
На самом деле мой клиент должен выступать как клиент для Worker-а и как сервер, предоставляющий этому Worker-у доступ к Data, через DataRemote. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:51:07 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgareМой клиент - это ejb компонент, расположенный на том же или соседнем сревере (я бы размышлял про соседний). Тогда о каком вообще локальном интерфейсе речь? Локальные вызовы работают исключительно в одной JVM. Выходит вам таки нужен DataRemote extends DataLocal Т.к. в основном вы используете только Remote интерфейс, и в исключительно редких случаях Local. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:58:10 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgare, А, так вы передаете ссылку на EJB, при чем remote, в качестве параметра другому EJB. Так нельзя делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 14:59:51 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Еще раз - для того, чтобы DataRemote можно было передать Worker-у его надо проинициализировать - собственно в этом и вопрос - как сделать инициализацию Data перед тем как отдать его Worker-у? Проинициализировать через методы DataRemote нельзя - а как можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:01:41 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Инициализация это часть life cycle. Открываем туториал и смотрим http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html PostContruct, PostActivate, init, ejbCreate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:04:31 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgareЕще раз - для того, чтобы DataRemote можно было передать Worker-у его надо проинициализировать - собственно в этом и вопрос - как сделать инициализацию Data перед тем как отдать его Worker-у? Проинициализировать через методы DataRemote нельзя - а как можно? Так получите ссылку в вашем Worker на DataRemote через аннотацию @EJB. И в методе @PostConstruct бина Worker вызовите DataRemote.init(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:04:50 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
wessen, Как это нельзя? Если инициализацию сделать сериализуемой, т.е. DataRemote{ init(...) get(...) } то я прекрасно смогу создать Statefull на DataRemote проинициализировать его и передать в Worker в виде remote-интерфейса. Проблема, что мне надо его проинициализировать не через rmi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:06:27 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Вот тут http://www.theserverside.com/discussions/thread.tss?thread_id=16226 человек хотел такого же. Только я не понял, получилось ли у него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:21:00 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Ааа... Удаленный клиент посылает серверу ссылку на Remote интерфейс, а сервер должен по ней найти Local интерфейс, т.к. бин находится в его JVM? Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:24:06 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
BlazkowiczАаа... Удаленный клиент посылает серверу ссылку на Remote интерфейс, а сервер должен по ней найти Local интерфейс, т.к. бин находится в его JVM? Так? Если да, то возникает резонный вопрос, а нафига так. Сделайте вызов на Remote интерфейса, который поместит себя в Worker. Зачем Worker вызывать удаленно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:32:21 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
>Удаленный клиент посылает серверу ссылку на Remote интерфейс Да >а сервер должен по ней найти Local интерфейс Нет, посылается ссылка на Remote интерфейс бина, который должен содержать данные, которые непонятно как в него положить >Зачем Worker вызывать удаленно? Ну затем, что Worker-а нет на этом сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:36:01 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgare>а сервер должен по ней найти Local интерфейс Нет, посылается ссылка на Remote интерфейс бина, который должен содержать данные, которые непонятно как в него положить ОК. Есть удаленный клиент, которому нужно положить несереализуемые данные в удаленный бин. Нет ли тут противоречия в том что всё происходит удаленное, но данные не сериализуются. bolgare>Зачем Worker вызывать удаленно? Ну затем, что Worker-а нет на этом сервере. Ну, так пусть бин сам найдёт и вызовет Worker, если они на одном серверве. И перестанте называть оба ваших "сервера" серверами, потому что в контексте вашей задачи один из них "клиент". А вы постоянно вносите этим путаницу. Нарисуйте или объясните нормально где находятся все три стороны: бин, клиент, worker ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 15:40:51 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
А есть у кого-нибудь более светлые идеи, чем у Blazkowicz? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 17:14:01 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
bolgareА есть у кого-нибудь более светлые идеи, чем у Blazkowicz? Остальным влом разбираться в невнятно сформированом вопросе: "есть сервер и сервер, local и remote, надо передать в worker, но не сериализуется". Объяснил бы четко кто где находится, почему нельзя сделать ни так, ни эдак. Может и желающие подтянулись бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 17:21:59 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Интересует вторая часть, а именно bolgare Код: java 1. 2. 3. 4. P.S. Просьба идеи по спецификации, как это сделать через одно место я знаю :) Раз Вы написали что знаете как это сделать через одно место, то как? Как передать data на сервер, по сути то что имеет смысл только на конкректном клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 17:32:16 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Через одно место - это совсем не по спеке, а именно. 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% этого не произойдет, да можно еще подумать и корректно обработать но такое решение юзать в продакшене совсем не хочется :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 18:11:18 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38030227&tid=2130607]: |
0ms |
get settings: |
14ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
48ms |
get topic data: |
23ms |
get forum data: |
5ms |
get page messages: |
104ms |
get tp. blocked users: |
2ms |
| others: | 296ms |
| total: | 534ms |

| 0 / 0 |
