Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
("sender account is not owned by the client");
else if(!accounts. contains(recipient))
throw new IllegalArgumentException
("recipient account is not owned by the client");
if(sender. getStatus() != 0)
throw new SuspendedAccountException
("Suspended account is used as sender");
else if(recipient. getStatus() != 0)
throw new SuspendedAccountException
("Suspended account is used as recipient");
double senderBalance = sender. getBalance();
double recipientBalance = recipient. getBalance();
if(senderBalance + sender. getCredit() < sum)
throw new TooSmallBalanceException
("Balance of sender is insufficient for transfer");
sender. setBalance(senderBalance - sum);
recipient. setBalance(recipientBalance + sum);
return true;
}
catch(IllegalArgumentException e)
{
throw e;
}
catch(SuspendedAccountException e)
{
throw e;
}
catch(TooSmallBalanceException e)
{
throw e;
}
catch(Exception e)
{
throw new EJBException(e);
}
}
}
· Для управляемых сообщениями компонентов
Компонент, управляемый сообщениями, недоступен для удаленных вызовов через RMI, и поэтому не имеет удаленных и локальных интерфейсов. Обращения к экземпляру такого компонента организуются в виде посылки сообщений в соответствиии с интерфейсом Java Message Service (JMS), основные интерфейсы и классы которого находятся в пакете javax.jms.
Такой компонент требует определения класса компонента, реализующего интерфейсы javax.ejb.MessageDrivenBean и javax.jms.MessageListener. Последний интерфейс требует определения метода void onMessage(Message), который разбирает содержимое пришедшего сообщения и определяет способ его обработки.
Кроме того, требуется определить еще методы void ejbCreate() для создания компонента и void ejbRemove() для освобождения ресурсов при его удалении.
Пример реализации класса управляемого сообщениями, использующего описанный выше сеансовый компонент для обработки асинхронных запросов на перевод денег между счетами, приведен ниже. В отличие от сеансового компонента, этот получает всю информацию о необходимом переводе в виде частей сообщения.
package ru. msu. cmc. prtech. examples. ejb;
import javax. ejb. EJBException;
import javax. ejb. MessageDrivenBean;
import javax. ejb. MessageDrivenContext;
import javax. jms. MapMessage;
import javax. jms. Message;
import javax. jms. MessageListener;
import javax. naming. Context;
import javax. naming. InitialContext;
import javax. naming. NamingException;
public class TransferProcessorBean
implements MessageDrivenBean, MessageListener
{
Context context;
public void setMessageDrivenContext (MessageDrivenContext mdc)
throws EJBException
{
try
{
context = new InitialContext();
}
catch(NamingException e)
{
throw new EJBException(e);
}
}
public void ejbCreate()
{ }
public void onMessage (Message msg)
{
MapMessage message = (MapMessage)msg;
try
{
Integer clientPK = (Integer)message. getObject("Client");
Integer senderPK = (Integer)message. getObject("Sender");
Integer recipientPK = (Integer)message. getObject("Recipient");
Double sum = (Double) message. getObject("TransferSum");
ClientHomeLocal clientHome = (ClientHomeLocal) context. lookup("ClientHomeLocal");
AccountHomeLocal accountHome = (AccountHomeLocal) context. lookup("AccountHomeLocal");
TransferHomeLocal transferHome = (TransferHomeLocal)context. lookup("TransferHomeLocal");
TransferLocal transfer = transferHome. create();
ClientLocal client = clientHome. findByPK(clientPK);
AccountLocal sender = accountHome. findByPK(senderPK);
AccountLocal recipient = accountHome. findByPK(recipientPK);
transfer. tranfer(client, sum. doubleValue(), sender, recipient);
}
catch (Exception e)
{
throw new EJBException(e);
}
}
public void ejbRemove () throws EJBException
{
try
{
context. close();
}
catch (NamingException e)
{ }
}
}
Дескрипторы развертывания компонентов EJB
Помимо декларации интерфейсов и классов компонентов, для построения EJB компонента его необходимо написать дескриптор развертывания — XML файл в специальном формате, определяющий набор компонентов приложения и их основные свойства.
Чаще всего дескрипторы развертывания не пушится вручную, их подготовку берут на себя специализированные инструменты для развертывания J2EE приложений. В рамках данного курса содержимое дескрипторов развертывания будет затронуто в рамках рассматрения поддержки платформой J2EE инфраструктуры распределенных бизнес-приложений и основных служб, в наличии которых такие приложения нуждаются.
Дескриптор развертывания упаковывается вместе с байт-кодом классов компонентов приложения в JAR-архив, который служит для развертывания этого приложения. При развертывании такой архив помещают в выделенную директорию, используемую сервером J2EE для поиска развертываемых приложений, и сервер осуществляет развертывание (запуск приложения, поиск кода необходимых компонентов при поступлении запросов) на основании информации, предоставленной дескриптором.
Начало декскриптора развертывания для набора EJB компонентов декларирует тот факт, что данный файл является дескриптором развертывания EJB компонентов и составлен в соответствии с определенной версией формата таких дескрипторов. Оно выглядит следующим образом.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" http://java. /j2ee/dtds/ejb-jar_2_0.dtd">
· Тело дескриптора развертывания набора EJB компонентов заключено внутри тегов <ejb-jar> </ejb-jar>. Оно может содержать следующие элементы (теги XML).
o <description>
Необязательный элемент.
Содержит описание данное дескриптора развертывания для человека.
Такой же элемент может содержаться внутри многих других тегов, обрамляющих описание отдельного компонента, связи, роли и пр., предоставляя описание этих соответвтующих сущностей.
o <display-name>
Необязателен.
Является меткой, используемой интрументами, работающими с дескрипторами. Такой же элемент может использовтаься внутри тегов <entity>, <session>, <message-driven>.
o <small-icon>, <large-icon>
Необязательны.
Указывают файлы иконок внутри JAR-архива приложения, куда входит и данный дескриптор. Иконки используются для представления JAR-архива в визуальной среде разработки. Эти же элементы используются внутри элементов <entity>, <session>, <message-driven> для определения иконок, представляющих отдельные компоненты.
o <enterprise-beans>
Обязательный элемент, должен появиться ровно один раз.
Содержит набор описаний EJB компонентов в виде элементов <entity>, <session>, <message-driven>.
o <relationships>
Необязателен, появился в EJB 2.0.
Описывает набор отношений между компонентами, которые соответствуют связям в схеме БД и автоматически поддерживаются контейнером.
o <ejb-client-jar>
Необязателен.
Содержит путь к JAR-файлу, содержащему классы, необходимые для работы клиентского приложения, — заглушки, удаленные интерфейсы и пр.
o <assembly-descriptor>
Необязателен.
Содержит элементы, описывающие правила использования компонентов — роли, политики предоставления доступа, политики создания транзакций и включения в имеющиеся транзакции и пр.
· Элементы <entity> и <session>.
Служат для описания компонентов данных и сеансовых компонентов. Могут содержать теги <description> с общим описанием компонента, <display-name> с меткой, используемой инструментами, <small-icon> и <large-icon> с указанием на файлы иконок для представления компонента в среде разработки.
o <ejb-name>
Требуется ровно один.
Задает имя компонента.
o <home>
Необязателен в EJB 2.0. В EJB 1.1 требуется ровно один.
Указывает полное имя удаленного внешнего интерфейса.
o <remote>
Необязателен в EJB 2.0. В EJB 1.1 требуется ровно один.
Указывает полное имя внешнего интерфейса.
o <local-home>
Необязателен, появился в EJB 2.0.
Указывает полное имя локального внешнего интерфейса.
o <local>
Необязателен, появился в EJB 2.0.
Указывает полное имя локального интерфейса.
o <ejb-class>
Требуется ровно один.
Указывает полное имя класса компонента.
o <primkey-field>
Необязателен, используется в описании компонентов данных.
Указывает имя поля-первичного ключа, если оно одно и связью компонента с БД управляет контейнер.
o <prim-key-class>
Требуется ровно один, используется в описании компонентов данных.
Указывает имя класса первичного ключа. Можно отложить точное определение класса первичного ключа до развертывания, тогда в этом поле указывается java.lang.Object.
o <persistence-type>
Требуется ровно один, используется в описании компонентов данных.
Имеет значения Bean или Container, в зависимости от того, управляется ли связь компонента с БД самим компонентом иил контейнером.
o <reentrant>
Требуется ровно один, используется в описании компонентов данных.
Имеет значения true или false, в зависимости от того, допускает ли компонент повторные вхождения (обращения из экземпляров компонентов, вызванных данным экземпляром, кроме него самого — автоматическое управление набором экземпляров EJB компонентов накладывает ограничения на такие вызовы, поскольку компонент не должен различать обращения клиентов; использование реентерабельных компонентов не рекомендуется).
o <cmp-version>
Необязателен, появился в EJB 2.0.
Указывает версию спецификаций EJB, в соответствии с которой разработан компонент, что определяет способ управления этим компонентом. Может иметь значения 2.x и 1.x.
o <abstract-schema-name>
Необязателен, появился в EJB 2.0.
Задает уникальный идентификатор компонента для использования в запросах на языке EJB QL, который используется для описания вручную запросов к схеме данных при реализации компонента данных, самостоятельно управляющего связью с СУБД.
o <cmp-field>
Может быть несколько, используется в описании компонентов данных.
Каждый такой элемент описывает одно поле данных, синхронизация которого с СУБД управляется EJB контейнером. Он может содержать тег <description> с понятным человеку описанием поля и должен содержать тег <field-name> с именем поля. В EJB 2.0 это имя совпадает с именем абстрактного свойства (для которого в классе компонента декларированы методы get<Name> и set<Name>), а в EJB 1.1 — с именем одного из полей класса компонента.
o <env-entry>
Может быть несколько, необязателен.
Описывает элемент окружения, доступный через JNDI.
Такой тег может содержать тег <description> (необязателен) и теги <env-entry-name> (обязателен), <env-entry-type> (обязателен, это может быть String или один из тпов-оберток примитивынх типов Java), <env-entry-value> (необязателен), определяющие имя, тип и значение элемента окружения. Из кода компонента значение такого элемента можно получить через интерфейс JNDI используя имя "java:comp/env/<name>".
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


