Для понимания необходимо: базовое знание языка 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
После успешной компиляции мы получим два .class-файла. Теперь нужно собрать их в один .jar, это делается командой
jar -cf test.jar *.class
Если 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
Спасибо! Очень полезная заметка. Помогла легко разобраться что происходит и как начать работу с EJB.
Особенно полезно, что никаких интегрированных сред разработки! Они скрывают происходящее, которое становится непонятным.
А куда все это класть то?