26 April 2009

Создание простейшего EJB 3 и клиентского приложения

Эта статься посвящена созданию простейшего EJB-модуля, его инсталляции в сервер приложений JBoss и удалённому вызову метода из клиентской программы.

Для понимания необходимо: базовое знание языка Java (наследование, интерфейсы)

Простейший EJB, пригодный для удалённого вызова, состоит из двух .java файлов:

1. Интерфейс, в котором описаны методы, предоставляемые бином, файл TestRemote.java:

import javax.ejb.Remote;

// Аннотация "@Remote" означает, что это интерфейс, описывающий
// методы доступные для вызова удалёнными клиентами
@Remote
public interface TestRemote
{
// Назовём наш метод просто getTime()
// Он вернёт строку с серверным временем
String getTime();
}


2. Собственно реализация, файл TestBean.java:

import javax.ejb.Stateless;

// Аннотация "@Stateless" указывает, что это будет
// бин без сохранения состояния между вызовами методов
@Stateless
public class TestBean implements TestRemote
{
// реализация метода, указанного в интерфейсе
public String getTime()
{
java.util.Date d = new java.util.Date();
return "Server time: " + d;
}
}


Компилируется командой:
javac -classpath .:<путь к папке JBoss>/common/lib/jboss-javaee.jar TestBean.java
Обратите внимание на двоеточие в опции -classpath, в среде Windows следует использовать ";".

После успешной компиляции мы получим два .class-файла. Теперь нужно собрать их в один .jar, это делается командой
jar -cf test.jar *.class
Тут мы получаем файл test.jar. Копируем его в каталог server/default/deploy в папке JBoss.
Если JBoss запущен, то обнаружив новый или обновлённый .jar в папке deploy - он подхватит и задеплоит его, о чём сообщит:


Теперь наш бин загружен в сервер приложений и доступен для вызова извне. Напишем простую программу для вызова метода - client.java:

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;

public class client
{
public static void main( String[] arg ) throws Exception
{
// Указываем параметры для связи с сервером приложений:
// классы для создания контекста и адрес сервера
Properties p = new Properties();
p.put( Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory" );
p.put( Context.PROVIDER_URL, "localhost" );

// Создаём начальный контекст, в котором будет
// производиться поиск объетов
Context ctx = new InitialContext(p);

// Ищем бин по имени, которое сообщил нам JBoss
Object ref = ctx.lookup( "TestBean/remote" );

// Приводим ссылку на объект к интерфейсу бина
TestRemote bean = (TestRemote)ref;

// И вызывем метод
String serverTime = bean.getTime();
System.out.println( serverTime );
}
}

Компилируется командой:
javac client.java

И запускаем:
java -classpath .:<путь к папке JBoss>/client/jbossall-client.jar client

Если программа не выбросила никаких иксепшенов, а вывела на консоль строку вида "Server time: Sun Apr 26 16:38:04 EEST 2009" - значит всё работает!

При реальном использовании у клиента должен быть доступ только к .class-файлу TestRemote. TestBean должен находиться только на сервере приложений.

В дальнейшем я планирую осветить некоторые неочевидные вопросы контроля доступа, авторизации с использованием БД и пр.
UPD: однако, поскольку мне жутко лень писать новые статейки - уж не знаю, будет ли продолжение...

2 comments

Jan 16, 2010, 11:07:00 PM

Спасибо! Очень полезная заметка. Помогла легко разобраться что происходит и как начать работу с EJB.

Особенно полезно, что никаких интегрированных сред разработки! Они скрывают происходящее, которое становится непонятным.

Jun 29, 2016, 1:03:00 PM

А куда все это класть то?

Post a Comment