2014-02-20 16 views
3

Возможно ли создать клиент, который обращается к компоненту EJB3, при этом клиент не будет зависеть от JAR поставщика или конфигурации? В настоящее время нам необходимо поддерживать сценарии, в которых наша служба развертывается на сервере WebSphere или JBoss, а клиент развертывается как приложение либо в WAS, либо в JBoss или работает как автономное приложение.Создать клиент-нейтральный клиент EJB3

Я имел обыкновение делать это с помощью EJB2.x beans, мне просто нужно было создать заглушки с помощью RMIC.

Но с EJB3, если я подключаюсь к WebSphere, я должен включать в себя JQ, но я должен предварительно сгенерировать заглушки с помощью инструментов WAS. Для JBoss я должен использовать jboss-client.jar.

+0

Я бы подумал об использовании ws over ejb для удаленного вызова –

+0

Да, я тоже об этом подумал, но мы уже шея в EJB. плюс мы не можем потерять повышение производительности, которое мы получили от использования RMI. – Renan

+0

От моего срока действия разница в производительности незначительна. Я думаю, вы также можете использовать серию jax-rs и java, если вас беспокоит производительность jax-ws –

ответ

3

Нет, это невозможно. Это было сделано явно в разделе 10 спецификации EJB 3.2:

В этой главе описывается поддержка совместимости для доступа к корпоративному компоненту через удаленный клиент-EJB 2.1 от клиентов распределенных по сети, и распределенный совместимость требования к вызовам на корпоративных компонентах от удаленных клиентов , которые являются компонентами Java Platform, Enterprise Edition (Java EE). Распределенная совместимость не определена для просмотра удаленного клиента EJB 3.x.

внимание также раздел 10.5.5:

значение системы классов сериализуемы классы, реализующие значение javax.ejb.Handle, javax.ejb.HomeHandle, javax.ejb.EJBMetaData, Java .util.Eneration, java.util.Collection и java.util.Iterator . Эти классы значений предоставляются контейнером EJB . Они должны быть предоставлены в виде файла JAR контейнером , на котором размещен ссылочный компонент.В сценариях взаимодействия, , если ссылочный компонент будет использовать такие классы значений системы во время выполнения , Deployer должен убедиться, что эти классы значений системы , предоставленные контейнером, на котором размещен ссылочный компонент, доступны для ссылочного компонента. Это может быть сделано, например, путем включения этих системных классов значений в путь класса ссылки на контейнер или путем развертывания классов системных значений с применением приложения-ссылки путем предоставления им средства развертывания .

Для WebSphere Application Server EJB thinclient содержит эти системные классы значений, а также реализацию IBM JNDI, использующую CosNaming. Теоретически этот запрос не нужен, если вам не нужны классы системных значений, а у вашего JVM клиента есть собственный ORB с реализацией CosNaming.

+0

Я использую класс SUN CosNaming. Я пытался заставить его работать, но Я сталкиваюсь с проблемами «несовместимости сериализации». Вероятно, это означает, что классы значений системы WAS не соответствуют классам значений системы SUN. – Renan

+0

Если вы можете предоставить конкретное сообщение/стек исключения (возможно, обновите описание вопроса или создайте другое вопрос), я могу попытаться взглянуть поближе. Возможно, классы значений для аргумента/return/exception различаются между клиентом и сервером? Если нет, возможно, t вот ошибка interop в коде Sun/Oracle или WAS. –

2

Короткий ответ: Нет, это не представляется возможным, так как клиент нуждается в трех вещах:

  • Классы интерфейса.
  • Клиентские библиотеки сервера AS (да, к сожалению)
  • Конфигурация сообщает клиенту адрес сервера/JNDI поиска пути (ОК, прод и т.д.)

Если клиент работает на (скажем, JBoss для JBoss), вам не понадобятся клиентские библиотеки и просто удастся выполнить удаленный поиск. Если у вас есть соединение серверов приложений клиент/сервер, это усложнит ситуацию, так как вам придется запускать клиентские библиотеки одного продукта в другом серверном продукте.

Говоря о автономных приложениях, работающих как клиенты, я бы только создал и предоставил 1 тяжелый клиентский jar/lib, содержащий не только классы интерфейса, но и клиентские библиотеки обоих серверов. Затем, предоставляя небольшой класс-помощник, который возвращает правильный InitialContext, созданный и основанный либо на JBoss, либо на Websphere в зависимости от флага в конфигурации клиента.

Я знаю, что эта последняя идея не является чистым решением, хотя может даже работать в другом продукте AS, работающем как «клиент».

+1

у нас на самом деле уже есть 1 тяжелый клиент JAR, который имеет класс, который действует как шлюз. Наша забота о том, что WAS thinterlient JARs относительно огромны (всего 17 МБ). Из-за проблем с лицензированием нам не разрешается связывать jboss-client.jar с нашим продуктом. – Renan

+0

Вы, сэр, находитесь в ужасной ситуации :(Помимо проблем с лицензированием, представьте, что в запущенном приложении WebSphere есть клиентский баннер JBoss, который, конечно же, также ищет локальные EJB. Конечно, это возможно с помощью кодированных запросов и инкапсулировать удаленный звонит, хотя вы тогда так далеки от сексуальных примеров HelloWorld, которые просто используют аннотации EJB/Inject и хорошо видят в учебниках JEE :( –

Смежные вопросы