JavaEE: EJB компонент на Jboss 7.1.
Сессионные компоненты, именно такие мы сейчас и будем создавать, разделяются на два вида:
- Без состояния (Stateless) - просто говоря, единственная возможность такого компонента это вызов его метода с его локальными данными. В таком компоненте, например, нельзя создать поле для сохранения чего-либо.
- С поддержкой текущего состояния сессии (Stateful) - такой компонент ведет себя как полноценный класс, в котором можно создать поля и работать с ними в течение сесси.
Вызов метода EJB компонента, который выполнится на сервере, с виду ничем не отличается от вызова метода обычного объекта, различие видно в способе создания самого объекта. Для получение доступа к EJB есть два способа: Dependency Injection (DI) и Java Naming and Directory Service (JNDI). В примере создадим два сессионных EJB компонента - без состояния и с поддержкой текущего состояния сессии. Клиентом будет обычное Java приложение, из чего следует, что для доступа к EJB будем использовать JNDI.
Пример создания EJB компонентов и клиента.
В примере будет использоваться Eclipse IDE (Indigo), сервер приложений - Jboss 7.1.1 Final, который поддерживает спецификацию EJB 3.1. По поводу установки Jboss 7 и Eclipse можно посмотреть здесь. Итак, создаем новый проект (File > New > EJB Project), добавляем интерфейс и класс Stateless EJB компонента:
package packg; public interface StatelessEjb { public String sayHi(String name); }
package packg; import javax.ejb.Stateless; import javax.ejb.Remote; @Stateless @Remote(StatelessEjb.class)
public class StatelessEjbBean implements StatelessEjb { @Override public String sayHi(String name){ return "Hi " + name + "!"; } }
Теперь создадим интерфейс и класс для Stateful компонента:
package packg; public interface StatefulEjb { public void put(String value); public String pop(); }
package packg; import java.util.Stack; import javax.ejb.Stateful; import javax.ejb.Remote; @Stateful @Remote(StatefulEjb.class) public class StatefulEjbBean implements StatefulEjb { private Stack<String> stack; public StatefulEjbBean(){ stack = new Stack<String>(); } @Override public void put(String value) { stack.push(value); } @Override public String pop() { return stack.pop(); } }
Как можно видеть, все что здесь нужно, это аннотации @Stateless, @Statefull и @Remote. На этом можно переходить к написанию клиентского приложения, что будет не намного сложнее. Создаем Java проект и добавляем в него интерфейсы StatelessEjb и StatefulEjb. Сам клиент:
public class Main { private static Logger log = Logger.getLogger(Main.class); public static void main(String[] args) { try { Context context = getInitialContext(); String nameStateless = "ejb:/testEJB/StatelessEjbBean!packg.StatelessEjb"; StatelessEjb statelessBean = (StatelessEjb) context .lookup(nameStateless); String nameStateful = "ejb:/testEJB/StatefulEjbBean!packg.StatefulEjb?stateful"; StatefulEjb statefulBean = (StatefulEjb) context .lookup(nameStateful); log.info("Вызов метода sayHi (stateless EJB)\n" + statelessBean.sayHi("Alex")); statefulBean.put("here we go"); log.info("Вызов метода pop (stateful EJB)\n" + statefulBean.pop()); } catch (Exception e) { e.printStackTrace(); } } public static Context getInitialContext() throws javax.naming.NamingException { Hashtable<String, String> prop = new Hashtable<String, String>(); prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); return new javax.naming.InitialContext(prop); } }
По сравнению с ранними версиями Jboss, в Jboss 7 доступ к EJB с помощью JNDI изменился. Вместо того, чтобы просто написать Context context = new InitialContext(), мы используем getInitialContext(). Раньше иcпользовался конфигурационный файл jndi.properties, а теперь нужно создавать файл jboss-ejb-client.properties (должен находиться в src):
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=4447
Теги: programming java javaEE
comments powered by Disqus