2013-04-09 2 views
1

Я пишу небольшую библиотеку java, предназначенную для использования в веб-приложении, а также в консольном приложении java.Как использовать встроенный openejb из приложения Java Java?

Чтобы получить прибыль от CDI и других функций javaEE 6 и не поддерживать две версии (java EE и java SE) библиотеки, я хотел бы использовать openejb (встроенный) для консольного приложения. Итак, я создал проект maven в eclipse и добавил артефакт openejb.

Как-то я просто не понимаю, как заставить консольную программу использовать контейнер openejb, то есть разрешить мои инъекции и другие функции javaEE.

Допустим, у меня есть два очень простых классов:

@Stateless 
Class A { 

    @Inject 
    public B member; 

    public A() {}; 

} 

и

@Stateless 
Class B { 

    public B() {}; 

    public String getString() { 
     return "Hello"; 

    } 

} 

Итак, как я мог бы получить простой старый класс Java с основной() метод сделать экземпляр членом A используя встроенный openejb? - таким образом, как:

public class TestOpenEJB { 

    public static void main(String[] args) { 

     Class A a = new A(); /*wrong of couse*/ 

     System.out.println(a.member.getString()); 

    } 
} 

Рабочее решение для этого простого примера было бы полезно.

Наконец, моя цель - предоставить Java api для Java, которая использует встроенный контейнер javaEE внутри.

Большое спасибо!

+0

Ваш @EJB не может быть выше класса (см. [API] (http://docs.oracle.com/javaee/6/api/javax/ejb/EJB.html)), это опечатка? - Кроме того, я бы рекомендовал, если возможно, сохранить вашу библиотеку независимо от того, где она используется, а затем использовать ее как в JSE, так и в JEE-приложении. –

+0

Это был мой первоначальный план. Библиотека будет в java SE и использована сервлетами. Это означает, однако, что ресурсы, используемые библиотекой, не управляются контейнером сервера. Не могли ли это вызвать проблемы при поступлении большого количества запросов (например, слишком много памяти распределено)? – datamole

+0

Я не знаю достаточно о вашей библиотеке, но для меня это немного странно, что вам нужны эти механизмы. Ваша библиотека с точки зрения пользователя использует бэкэнд-систему, которая используется как сервлетом, так и администратором с доступом к консоли таким же образом, как вы можете использовать базу данных из вашего веб-приложения и консоли. Таким образом, у вас в основном есть одна и та же проблема, независимо от того, каким образом вы ее используете, но она должна быть независимой от этого.Что касается ресурсов, конечно, вам нужно либо заботиться о параллельном доступе, либо о нескольких экземплярах/пулах, или вам необходимо принять последовательный доступ. –

ответ

0

В дополнение к моим комментариям, я думаю, ваша проблема может быть решен таким образом:

Перейти на и модели поведения вашей библиотеки с EJBs (как показано в вашем примере кода). Это хороший подход, поскольку контейнер заботится о таких вещах, как объединение, параллельный доступ, транзакции и т. Д.

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

И для доступа к нему через консольное приложение вы можете запустить его в клиентском контейнере приложения (что предпочтительнее, чем пытаться вставить контейнер в приложение) или (что я рекомендовал бы), выставляя свою бизнес-логику в дополнительный способ (например, через REST) ​​и использовать его в автономном клиентском приложении.

PS: Для интеграции тестирования вашей бизнес-логики с помощью механизмов DI используйте Arquillian.

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