|
|
|
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 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Все ссылки имеет смысл регистрироваьт где-то на сервере, если они потом стабильно нужны будут. А если в Worker попадают единичные бины, то держать из-за этого ссылки на все локальные инстансы, это какой-то оверхед. Вы меня специально игнорируете? Что мешает бину самому запустить себя в Worker? У вас получается Клиент нашел ссылку на Data Клиент нашел ссылку на Worker Клиент сказал Worker-у обработать Data. Применяем Inversion of Control получаем Клиент нашел Data. Клиент сказал Data обработаться. Data нашел Worker-а и передал ему this. В чем проблема найти на сервере Worker-а? 2 удаленных вызова вместо 3-х. По-моему отличная оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2012, 18:18:48 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Worker умеет работать только с некоторыми данными, и умеет с ними работать по интерфейсу DataRemote. Таких Worker-ов не один - поэтому "Что мешает бину самому запустить себя в Worker?" дата не значет что надо запускать, это разруливается другим бином. Т.е. изначально есть бин Client, который готовит Data (полностью для всех дальнейших манипуляций) - т.е. реально Data - это некоторые подготовленные (зачитанные) из БД данные + некоторые методы их конвертации и предобработки. А дальше этот Client начинает запускать несколько Worker-ов, которые с этими данными умеют обращаться. Но отдать Data на Worker возможности нет, т.к. 1. Это большой объем, который при клонировании (в случае если Worker на той же ноде) может привести к OutOfMemory, 2. Есть данные (а точнее правила конвертации, строящиеся в runtime), которые не сериализуются. P.S. Ну я в целом понял, что по EJB этого сделать нельзя - соответственно нужно решение сверх спеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2012, 10:56:11 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Понятно стало ещё меньше. Worker и Client в одной JVM, а Data в другой? Так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2012, 11:32:50 |
|
||
|
EJB Local and Remote
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Вот собственно как поменять "???" чтобы оно заработало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2012, 12:41:49 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2130607]: |
0ms |
get settings: |
20ms |
get forum list: |
20ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
52ms |
get topic data: |
23ms |
get forum data: |
6ms |
get page messages: |
104ms |
get tp. blocked users: |
3ms |
| others: | 326ms |
| total: | 568ms |

| 0 / 0 |
