#java #ejb-3.0 #weblogic #ejb
#java #ejb-3.0 #weblogic #ejb
Вопрос:
Мне нужно создать 1 веб-службу restful с использованием weblogic. У этого веб-сервиса будут параметры для выбора того, какие данные должен возвращать сервис. Например, ‘customer’ или ‘product’.
Теперь я хочу развернуть код ‘customer’ и ‘product’ как отдельные развертываемые приложения, чтобы я мог добавлять или удалять новый код без повторного развертывания всего кода каждый раз, когда происходят изменения.
Итак, я хочу, чтобы один общий веб-сервис вызывал эту бизнес-логику.
Мой вопрос в том, каков наилучший способ структурировать это? Могу ли я развернуть отдельные EJB для своей бизнес-логики и заставить веб-службу вызывать EJB на основе переданных параметров?
Или я должен иметь бизнес-компоненты в виде разделяемой библиотеки и называть их таким образом? Я ищу способ добиться наилучшей производительности.
У меня будет около 20 различных бизнес-модулей, написанных другими программистами. Как я уже сказал, я не хочу, чтобы все модули находились в одном файле EAR или WAR. Они должны быть доступны для развертывания отдельно.
Есть мысли?
Ответ №1:
WebLogic 10.3.4 включает в себя новую поддержку Java EE6 API, включая JAX-RS 1.1 с Jersey. Недавно мы провели веб-трансляцию по этой функциональности, и веб-трансляция # 4 охватывает JAX-RS. Вот ссылка: http://www.oracle.com/technetwork/middleware/weblogic/learnmore/weblogic-javaee6-webcasts-358613.html Существует также пример приложения для этого, называемого Oracle Parcel Service, и вы можете загрузить код здесь: https://www.samplecode.oracle.com/sf/projects/oracle-parcel-svc /.
Если вы используете JAXB, вы можете выполнять маршаллинг из JSON и XML в один и тот же объект Java. Проблема здесь в том, что сгенерированные JAXB классы по умолчанию не сериализуемы, поэтому, если вы захотите получить доступ к удаленному EJB из службы JAX-RS, у вас возникнет проблема.
Поскольку вы не можете размещать модули в одном EAR, есть другой вариант. Возможно, вы могли бы использовать разделяемые библиотеки Java EE. Затем вы могли бы развернуть свои EJB как разделяемую библиотеку Java EE и ссылаться на эту библиотеку в своем REST-клиенте. Вот пример:
В вашем модуле EJB включите в свой манифест что-то вроде следующего:
Extension-Name: ops-util
Implementation-Title: OPS 2.0 Utils Library EXAMPLE_ONLY
Implementation-Vendor: Oracle
Implementation-Vendor-Id: com.oracle
Implementation-Version: 2.0.1
Specification-Title: Oracle Parcel Service 2.0 Utils Library
Specification-Vendor: Oracle
Specification-Version: 2.0
Затем обратитесь к общей библиотеке в weblogic.xml (ВОЙНА) или weblogic-application.xml (EAR):
<wls:weblogic-application
xmlns:wls="http://www.bea.com/ns/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://www.bea.com/ns/weblogic/weblogic-application http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<!-- server-version: 10.3 -->
<wls:library-ref>
<wls:library-name>ops-util</wls:library-name>
<wls:specification-version>2.0</wls:specification-version>
<wls:implementation-version>2.0.1</wls:implementation-version>
<wls:exact-match>false</wls:exact-match>
</wls:library-ref>
</wls:weblogic-application>
Комментарии:
1. Да, я использую Jax-rs. Недостатком является то, что по политике компании любой код, который перераспределяется в рабочую среду, должен быть повторно протестирован, даже если он не был изменен (несчастные случаи действительно случаются). Итак, я хочу развернуть только новые или измененные бизнес-функции без развертывания всего приложения.
2. Интересный подход, я понимаю, почему они это сделали, но это явно чрезмерно усложняет вашу работу. Вы можете использовать «удаленный» вызов EJB из вашего приложения JAX-RS (даже если оно развернуто в том же контейнере). Просто создайте InitialContext без параметров, и вы сможете посмотреть свой EJB:
3. Я смог развернуть ejb отдельно от приложения jax-rs и заставить его работать с удаленным интерфейсом. поскольку оба они работают в одной и той же jvm, есть ли способ заставить локальный интерфейс работать?
4. Я так не думаю, но я не уверен. Я полагаю, что локальный интерфейс предназначен для использования между классами или модулями в одном и том же развертывании приложения. Кроме того, вам пришлось бы развернуть ваш модуль REST (предположительно WAR) и ваш модуль EJB (JAR) в файле ear, что нарушает требование их раздельного развертывания.
5. в качестве альтернативы, вы могли бы создать сквозной интерфейс REST для вашего EJB и развернуть его С помощью вашего EJB, а затем вызвать EJB через интерфейс REST из вашего другого развертывания REST. Это не идеально, но правильный способ сделать это — упаковать ваш REST и EJB в EAR.