![]() | ![]() ![]() ![]() ![]() |
EJB-объект сам по себе бесполезен; нам нужен хотя бы один простой клиент для пользования им. Пользователем EJB может быть другой EJB-объект, простой JavaBean, JSP-страница, апплет или обычное приложение. В нашем примере, для упрощения, мы закодируем обычное приложение. Это приложение создаст объект класса Interest и выполнит его единственный метод.
Во время установки объекта, выполненной на предыдущем шаге, сервер разместил home-интерфейс EJB-объекта под JNDI-именем "interest/Interest" и экспортировал home-интерфейс, так что он теперь может быть вызван через RMI. Мы собираемся рассказать вам о том, как получить home-интерфейс из клиента при помощи JNDI и вызывать его методы. Пример кода приведен ниже:
Рисунок 1.8. Код тестового клиента, имя файла InterestClient.java
package org.jboss.docs.interest;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import org.jboss.docs.interest.Interest;
import org.jboss.docs.interest.InterestHome;
/**
Это простое приложение проверяет 'Interest' Enterprise JavaBean который
имлементирован в пакете 'org.jboss.docs.interest'. Для того, чтобы этот тест заработал
объект должен быть развернут на EJB-сервере.
*/
class InterestClient
{
/** Этот метод делает всю работу. Он создает экземпляр объекта Interest EJB на сервере,
и вызывает его метод `calculateCompoundInterest()', после этого печатает результат вычислений.
*/
public static void main(String[] args)
{
// Заключение всего процесса в один блок 'try' не самый хороший путь для обработки исключений,
// но я не хочу усложнять программу множеством блоков 'catch'
try
{
// Получаем контекст имен. (naming context)
InitialContext jndiContext = new InitialContext();
System.out.println("Got context");
// Получаем ссылку на объект Interest Bean
Object ref = jndiContext.lookup("interest/Interest");
System.out.println("Got reference");
// Получаем ссылку на его home-интерфейс
InterestHome home = (InterestHome)
PortableRemoteObject.narrow(ref, InterestHome.class);
// Создаем объект Interest с помощью home-интерфейса
Interest interest = home.create();
// вызываем метод calculateCompoundInterest() для того, чтобы выполнить вычисления
System.out.println("Interest on 1000 units, at 10% per period, compounded over 2 periods is:");
System.out.println(interest.calculateCompoundInterest(1000, 0.10, 2));
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
Заметьте, что клиент ищет интерфейс InterestHome под именем JNDI "interest/Interest". Home-интерфейс вашего объекта должен быть размещен под этим именем если вы сопроводили приложение необходимым файлом jboss.xml. Если это не так, имя JNDI будет "Interest". Соединение с реализацией JNDI от JBoss требует создание объекта InitialContext с правильно настроенным файлом jndi.properties в пути classpath вашего клиентского приложения. В коде, все что необходимо это:
// Get a naming context
InitialContext jndiContext = new InitialContext();
System.out.println("Got context");
Файл jndi.properties который мы будем использовать расположен в файле examples/resources/jndi.properties в вашем каталоге с примерами файлов для этой документации. Его содержимое:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
Этот файл определяет класс InitialContextFactory, ссылку на провайдера (provider url) и пакеты для фабрик объектов (object factories) специфичных для JBoss JNDI provider. Provider url может быть сокращен до "localhost" или имени компьютера на котором работает JBoss, в этом случае используется порт по умолчанию 1099.
Комментарии в программе должны объяснить как она работает; один из пункт требует пояснения - рекомендованый путь для получения ссылки на home-интерфейс должен выглядеть следующим образом:
InterestHome home = (InterestHome) PortableRemoteObject.narrow (ref, InterestHome.class);
таким образом вы гарантируете совместимость с различными протоколами RMI (например, RMI/IIOP). Метод 'narrow' гаранитрует, что объект 'ref' может быть сконвертирован в объект класса 'InterestHome'.
Тестовый клиент не должен быть в том же пакете, что и EJB-класс и, на практике, он и не будет. Так что необходимо импортировать EJB-классы используя их полные имена классов, как это проиллюстрированно.
Для компиляции и запуска InterestClient выполните следующую команду:
Приведенный вывод - это то, что вы должны увидеть если все пойдет хорошо.
Вывод показывет, что classpath использованый для запуска клиента включает
несколько jar-файлов, расположенных в клиентской директории JBoss, так же
как и директорию, содержащую скомпилированные классы примеров и директорию,
содержащую файл jndi.properties. Эти клиентские jar-файлы JBoss содержат стандартные
интерфейсы EJB и JNDI, наряду со специфичным для JBoss кодом. Вот эти jar-файлы:
Кроме этого на серверной консоли должен быть вывод от Interest EJB. Он сгенерирован для того, чтобы показать что объект был выполнен на сервере, а не клиенте. Посмотрите на нечто похожее в серверных логах или на консоли:
[Interest] Someone called `calculateCompoundInterest!'
Хорошо, вот он. Мы рассмотрели кодирование, компилирование и развертывание EJB, и закодировали и запустили простой тестовый клиент.
![]() | ![]() ![]() ![]() ![]() |
| Наши друзья |