Главная » Java, Web » Компонент EJB-сессии

0

Создание компонента EJB-сессии представляется еще более простым. не имеет первичного ключа, обладает удаленным и домашним интерфейсом, а также не связан с базами данных. Чтобы создать компонент EJB-сессии, снова воспользуемся проводником Blizzard. Компонент EJB будет выдавать биржевые котировки, располагаясь на том компьютере, где информация о котировках будет храниться в виде файла, расположенного в фиксированном каталоге. Пусть это будет файл c:\StockPrices.txt. Клиент будет обращаться к компоненту EJB, указывая название акций, в ответ же он будет получать котировки акций.

Запускаем проводника создания серверных компонентов EJB Blizzard, выбираем пункт Create a Session Bean, задаем название компонента EJB BobKotirovki, название пакета, где будут храниться файлы компонента EJB PaketKotirovki, и каталог, куда будут помещены файлы c:\ejb\kotirovki (рис. 5.29). Также вставим в компонент EJB данные stock и price.

Данные stock должны иметь тип string, а цена price — тип float. Методы задания параметра для данных цены (Generate Setter Methods) не потребуются, но они нужны для данных stock. Помимо этого отметим, что компонент EJB будет поддерживать состояние сессии (отметить stateful), а транзакции будут регулироваться средствами контейнера (отметить let the container manage transacton boundaries). После совершения всех операций нажимаем кнопку Build.

Через несколько мгновений получаем уже знакомый набор файлов и папок в каталоге c:\ejb\kotirovki. Это файлы BobKotirovki.java (листинг 5.8) — класс компонента EJB, BobKotirovkiHome.java (листинг 5.9) — домашний

Рис. 5.29. Создание компонента EJB-сессии

интерфейс и BobKotirovkiBean.java (листинг 5.10) — удаленный интерфейс. В сгенерированных файлах не содержится первичного ключа, в них не будет метода findByPrimaryKey.

Листинг 5.8. Удаленный интерфейс BobKotirovki.java — сгенерирован Blizzard

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard // Удаленный интерфейс для компонента EJB-сессии "BobKotirovki".

impo rt j avax.ejb.*; import java.rmi.*;

public interface BobKotirovki extends javax.ejb.EJBObject { String getStock() throws java.rmi.RemoteException; void setStock(String stock) throws java.rmi.RemoteException; float getPriceO throws java.rmi.RemoteException; // Задача разработчика: // прочие методы удаленного интерфейса.

Листинг 5.9. Домашний интерфейс BobKotlrovklHome.java — сгенерирован Blizzard

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard // Домашний интерфейс для компонента EJB-сессии "BobKotirovki".

impo rt j avax. e j b. *; import java.rmi.*; import java.util.*;

public interface BobKotirovkiHome extends javax.ejb.EJBHome { BobKotirovki create( String stock, float price

) throws javax.ejb.CreateException, java.rmi.RemoteException;

Листинг 5.10. Файл класса компонента EJB BobKotlrovklBean.java — сгенерирован Blizzard

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard // Класс компонента EJB-сессии "BobKotirovki".

impo rt j avax.ej b.*; impo rt j avax.naming.*; import java.rmi.*;

public class BobKotirovkiBean implements javax.ejb.SessionBean { public String stock = null; public float price = 0.0F;

// контекст сессии

javax.ejb.SessionContext ejbSessionContext = null; public String getStock() throws java.rmi.RemoteException

return stock;

public void setStock(String stock) throws java.rmi.RemoteException

this.stock = stock; }

public float getPrice() throws java.rmi.RemoteException {

return price; }

// Задача разработчика: // прочие методы.

// Метод ejbCreate по умолчанию, public void ejbCreate( String stock, float price

)

throws j avax.ej b.CreateExcept ion, java.rmi.RemoteException {

this.stock = stock;

this.price = price;

}

// Задача разработчика:

// прочие методы, выполняемые во время создания компонента EJB-сессии.

public void setSessionContext(javax.ejb.SessionContext ejbSessionContext)

throws RemoteException {

this.ejbSessionContext = ejbSessionContext; }

public void unsetSessionContext ()

throws RemoteException {

this.ejbSessionContext = null; }

public void ejbRemoveO

throws java.rmi.RemoteException, javax.ejb.EJBException {

// Задача разработчика:

// прочие методы, выполняемые при удалении экземпляра компонента // EJB-сессии

public void ejbActivate() throws java.rmi.RemoteException

// Задача разработчика: // обращение к ресурсам.

public void ejbPassivate() throws java.rmi.RemoteException

// Задача разработчика // сохранение ресурсов.

Нам будет необходим ресурс, то есть файл с котировками c:\StockProces.txt (листинг 5.11). Формат информации, представленной в файле, следующий:

название_ащии : цена

Листинг 5.11. Вспомогательный файл c:\StockPrices.txt                                                           j

AOL: 151.03 AWE: 127.30 IBM: 190.25 SUNW: 213.11 ORCL: 152.62 INTC: 271.85 MSFT: 170.34 DELL: 226.35 JDSU: 192.47 T: 90.62 LU: 28.12 EMC: 365.97 GOU: 107.11 GE: 4.27 CSCO: 20.42

Сейчас необходимо внести изменения в файл класса компонента EJB- сессии stockQuotesBean. java. Вставим инструкцию импорта пакета java.io.* (будем работать с файлом StockProces.txt). Удалим переменную price, а также связанные с этой переменной действия, а именно, аргумент price в методе ejbCreate, и фрагмент, где задается значение для price. В листинге выше все удаляемые фрагменты выделены полужирным шрифтом.

Кроме того, необходимо создать заново метод getPrice(). Новый метод будет выглядеть так, как показано ниже (листинг 5.12).

Листинг 5.12. Метод getPrice ()                                                                                                        |

public float getPrice() throws java.rmi.RemoteException, j ava.io.IOExcept ion

BufferedReader reader; reader = new BufferedReader( new FileReader("C:\\StockPrices.txt")); String line;

String prefix = stock.toLowerCase() + ":"; while ((line = reader.readLine()) != null) { if (line.toLowerCase().startsWith(prefix)) { line = line.substring(prefix.length()); reader, close () ;

return Float.parseFloat(line.trim()) ;

}

reader, close () ;

throw new java.rmi.RemoteException("Not found"); // оставим без создания класса обработки ошибки

Таким образом, были внесены изменения в метод getPrice о, которые потребуют внесения изменений в файле BobKotirovki.java, где нужно внести в список исключений функции getPrice () исключение java.io.IOException. Такое же изменение нужно произвести в файле BobKotirovkiHome. java, кроме того, в этом файле необходимо удалить переменную price.

Окончательный вид исходных файлов приведен ниже (листинги 5.13—5.15).

Листинг 5.13. Удаленный интерфейс — окончательный вариант (BobKotirovki.java)

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard // Удаленный интерфейс для компонента EJB-сессии BobKotirovki.

impo rt j avax. e j b. *; import java.rmi.*;

public interface BobKotirovki extends javax.ejb.EJBObject { String getStock() throws java.rmi.RemoteException; void setStock(String stock) throws java.rmi.RemoteException; float getPriceO throws java.rmi.RemoteException, java.io.IOException ; // прочие методы

Листинг 5.14. Домашний интерфейс — окончательный вариант (BobKotlrovklHome.java)

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard // Домашний интерфейс для компонента EJB-сессии "BobKotirovki".

impo rt j avax.ej b.*; import java.rmi.*; import java.util.*;

public interface BobKotirovkiHome extends javax.ejb.EJBHome { BobKotirovki create( String stock // float price

) throws javax.ejb.CreateException, java.rmi.RemoteException, java.io.IOException;

Листинг 5.15. Класс компонента EJB — окончательный вариант (BobKotlrovklBean.java)

package PaketKotirovki;

// File generated by Desiderata Software’s Blazix session bean wizard

11 Класс компонента EJB сессии "BobKotirovki".

impo rt j avax.ej b.*; impo rt j avax.naming.*; impo rt j ava.rmi.*; import j ava.io.* ;

public class BobKot irovkiBean implements j avax.ej b.SessionBean { / / переменные

public String stock = null; // контекст сессии

javax.ejb.SessionContext ejbSessionContext = null; // методы get и set

public String getStock() throws java.rmi.RemoteException {

return stock; }

public void setStock(String stock) throws java.rmi.RemoteException {

this.stock = stock; }

/* public float getPrice () throws java.rmi.RemoteException {

return price; }

*/

public float getPrice() throws java.rmi.RemoteException,

j ava.io.IOExcept ion {

BufferedReader reader; reader = new BufferedReader( new FileReader("C:WStockPrices.txt")); String line;

String prefix = stock.toLowerCase() + ":"; while ((line = reader.readLine()) != null) { if (line.toLowerCase().startsWith(prefix)) { line = line.substring(prefix.length()); reader, close () ;

return Float.parseFloat(line.trim ()); }

}

reader, close () ;

throw new java.rmi.RemoteException("Not found");

// оставим без создания класса обработки ошибки }

// Дополнительные методы // Метод ejbCreate по умолчанию public void ejbCreate( String stock //, // float price )

throws j avax.ej b.CreateExcept ion, java.rmi.RemoteException {

this.stock = stock;

// this.price = price; }

// Дополнительные методы на момент создания компонента EJB // прочие методы компонента EJB-сущности public void setSessionContext (j avax.ej b.Sess ionContext ej bSess ionContext)

throws RemoteException {

this.ejbSessionContext = ejbSessionContext; }

public void unsetSessionContext()

throws RemoteException {

this.ejbSessionContext = null; }

public void ejbRemoveO

throws java.rmi.RemoteException, javax.ejb.EJBException {

// методы на момент удаления экземпляра компонента ЕJB }

public void ejbActivate()

throws java.rmi.RemoteException {

// обращение к ресурсам

public void ejbPassivate() throws java.rmi.RemoteException

// сохранение ресурсов

После внесения всех изменений запускаем командный файл build.com, компонент EJB будет благополучно создан (рис. 5.30).

Для того чтобы разместить вновь созданный компонент EJB на сервере компонентов EJB, нужно либо скопировать файл BobKotirovkiEjb.jar в каталог ejbdir сервера Blazix, либо указать в файле ejb.ini:

Рис. 5.30. Создание компонента EJB-сессии завершено

ejbJar: с:\ejb\kotirovki\BobKotirovkiEjb.jar

Рис. 5.31. успешно размещен на сервере

Запускаем сервер компонентов EJB и убеждаемся, что новый компонент EJB был успешно размещен (рис. 5.31).

Сейчас необходимо постараться использовать созданный компонент EJB- сессии. Для этого создадим класс клиента (листинг 5.16).

Листинг 5.16. Клиентская программа ClientKotirovki.java

impo гt j avax.naming.*; import javax.rmi.*; impo rt j avax. e j b. *; import java.util.*; import java.io.*; import PaketKotirovki.*;

public class ClientKotirovki {

static public void main(String[] args) {

try {

// поиск компонента EJB Properties env = new Properties(); env.put("java.naming.factory.initial", "desisoft.ejb.client.JRMPFactory"); env.put("desisoft.ej b.nameServerl", "localhost:2050");

Context ctx = new InitialContext(env); BobKotirovkiHome home = (BobKotirovkiHome) PortableRemoteObject.narrow(ctx.lookup("BobKotirovki"), BobKotirovkiHome.class);

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); for (;;) { System.out.print("Stock symbol: "); String stock = input.readLine(); if (stock.equals("")) continue;

if (stock.equalsIgnoreCase("quit")) break;

BobKotirovki bean = home.create(stock); try {

System.out.println("Price = " + bean.getPrice()); } catch (Exception ex) { ex.printStackTrace();

} }

} catch (Exception ex) {

ex.printStackTrace() ; }

}

Компилируем программу и запускаем ее.

Java ClientKotirovki

Перед компиляцией не забудьте указать путь к файлу BobKotirofkiEjb.jar в переменной class path. После запуска программа приглашает ввести название акции. После ввода названия акции программа выводит котировку. Если название введено неправильно, то появляется сообщение об ошибке. В наших примерах обработка сообщений об ошибках не предусмотрена (рис. 5.32).

Рис. 5.32. Работа с компонентом EJB-сессии

Если запустить программу без наличия файла StockPrices.txt, то также будет выдано сообщение об ошибках.

К компоненту EJB можно обращаться из нескольких клиентов одновременно. При этом будет создано столько экземпляров компонентов EJB, сколько независимых запросов получено от разных клиентов (рис. 5.33).

Рис. 5.33. Компонент EJB одновременно работает с несколькими клиентами

 

Рис. 5.34. Создание компонента EJB-сессии без поддержки состояния

При создании компонента EJB мы указали stateful, т. е. компонент EJB поддерживает состояние при работе с клиентом. При создании компонента EJB для работы с ценами акций можно было создать такой компонент EJB, который бы не поддерживал текущее состояние клиента. При этом в зависимости от сервера компонентов EJB, многочисленное обращение из разных клиентов к такому компоненту EJB может либо приводить к появлению нескольких самостоятельных экземпляров компонентов EJB, либо может оказаться достаточным использование единственного экземпляра компонента EJB. При создании компонента EJB без поддержки состояния в проводнике Blizzard следует отметить пункт stateless (рис. 5.34).

Удаленный интерфейс в этом случае будет содержать один метод:

public float getPrice(String stock)

throws java.rmi.RemoteException, java.io.IOException;

Файл класса компонент EJB будет содержать переменную

int count = 0;

Имплементация метода getPrice будет иметь следующий вид (листинг 5.17).

Листинг 5.17. Метод getPrice() компонента EJB без поддержки состояния

public float getPrice(String stock) throws java.rmi.RemoteException, j ava.io.IOExcept ion

count++;

System.out.println("Count = " + count); BufferedReader reader; reader = new BufferedReader( new FileReader("C:\\StockPrices.txt")); String line;

stock = stock.toLowerCase() + ":"; while ((line = reader.readLine()) != null) { if (line.toLowerCase().startsWith(stock)) { line = line.substring(stock.length()); reader, close () ;

return Float.parseFloat(line.trim()) ;

}

}

reader, close () ;

throw new java.rmi.RemoteException("Not found");

Метки компонентов EJB

В примерах, которые мы использовали ранее, был осуществлен поиск компонента EJB и его создание. Поиск компонента EJB осуществлялся стандартным образом. В компонентах EJB-сессий нет методов поиска компонента EJB, компонент EJB исчезает в момент прекращения работы программы. Однако для получения доступа к компонентам EJB помимо поиска существует возможность использования меток серверных компонентов EJB.

Объекты компонентов EJB и домашние объекты располагают своими метками. Эти метки могут быть затребованы из компонента EJB или из домашнего объекта. Метки не используются во время выполнения программы, они нужны только во время выхода из программы и при повторном ее запуске. Метка существует постоянно. При выходе из программы необходимо иметь возможность сохранения метки. Метку можно записать в файл. Метки создаются на основе класса java.io.seriaiizabie, а значит, их действительно можно сохранять в виде файлов.

Код создания метки объекта и получения объекта по его метке достаточно прост. Пример приводится ниже.

Handle handle = stock.getHandle(); ObjectOutputStream p = new ObjectOutputStream(

new FileOutputStream("C:\\FajlMetki.dat")); p.writeObject(handle); p.close ();

Чтение метки осуществимо следующим образом.

ObjectlnputStream р = new ObjectInputStream( new FilelnputStream("С:\\FajlMetki.dat")); Handle handle = (Handle) p.readObject();

BobKotirovki stock = (BobKotirovki) handle.getEJBObject();

Необходимо отметить, что полученный по метке объект должен быть приведен к необходимому типу.

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии