Spec-Zone .ru
спецификации, руководства, описания, API
|
Эта работа рассматривает, как позволить клиенту, записанному на любом языке, поддерживаемом CORBA получить доступ к Предприятию компоненты JavaBeansTM ("компоненты EJBTM"). Эта бумага направляется на программистов с усовершенствованным знанием и JavaTM 2 Платформы, Enterprise Edition ("J2EETM") и CORBA (Общая Архитектура Посредника запросов к объектам).
Технология J2EE упрощает приложения для предприятия, базируя их на стандартизированных, модульных и допускающих повторное использование компонентах, основанных на Предприятии JavaBeansTM (EJBTM) архитектура, обеспечивая полный набор служб к тем компонентам, и обрабатывая много деталей поведения приложения автоматически. Автоматизируя многие из отнимающих много времени и трудных задач разработки приложений, технология J2EE позволяет разработчикам предприятия сосредотачиваться на увеличивании стоимость, то есть, улучшении бизнес-логики, вместо того, чтобы создать инфраструктуру.
Компонентная модель серверной стороны EJBTM упрощает разработку компонентов промежуточного программного обеспечения, которые являются транзакционными, масштабируемыми, и переносимыми. Предприятие серверы JavaBeans уменьшает сложность разработки промежуточного программного обеспечения, оказывая автоматическую поддержку для служб промежуточного программного обеспечения, таких как транзакции, безопасность, связь базы данных, и больше.
CORBA является Группа по управлению объектами (OMG) стандарт, который является открытой, архитектурой не зависящий от производителя продукта и инфраструктурой что использование компьютерных приложений, чтобы сотрудничать по сетям. Используя стандартный интернет-Протокол Межшара (IIOP), CORBA-на-основе программа от любого поставщика, на почти любом компьютере, операционной системе, язык программирования, и сеть, могут взаимодействовать с CORBA-на-основе программой от того же самого или другого поставщика, на почти любом другом компьютере, операционной системе, языке программирования, и сети. Чтобы узнать больше о CORBA, посетите
Технология CORBA дополняет платформу Java, служа распределенной основой объектов, службы, чтобы поддерживать ту платформу, и функциональную совместимость с другими языками. Технология CORBA является неотъемлемой частью Java 2 платформы, используемые в Предприятии компоненты JavaBeans, Java Удаленные API Вызова метода, работающие на основе интернет-Протокола Межшара ("IIOP RMI Java"), и API IDL Java ("IDL Java").
Язык определения интерфейсов OMG (IDL) используется, чтобы описать интерфейсы, реализовываемые удаленными объектами. IDL используется, чтобы определить имя интерфейса и имена каждого из атрибутов и методов. Как только Вы создаете файл IDL, можно использовать компилятор IDL, чтобы генерировать клиентский тупик и скелет сервера на любом языке, для которого OMG определил спецификацию для такого отображения языка. Чтобы узнать больше о IDL OMG, посетите
IDL Java позволяет распределенным приложениям Java прозрачно вызвать операции на удаленные сетевые службы, используя IDL OMG промышленного стандарта и IIOP, определенный Группой по управлению объектами (javax.rmi
API.
Разработчики, которые программируют компоненты EJB, следуют за Java модель программирования RMI для их распределенной объектной модели, где необходимый транспорт, распространенный через все серверы приложений, является IIOP RMI Java. В неоднородных серверных средах стандартное отображение архитектуры EJB к CORBA включает следующей функциональной совместимости:
Остальная часть этого документа обеспечивает пример клиентского приложения CORBA, получающего доступ к объекту корпоративного компонента. В этом документе клиент CORBA имеет в виду клиентское приложение, записанное на любом языке, поддерживаемом CORBA, включая язык программирования Java, C++, C, Smalltalk, КОБОЛ, Аду, Lisp, или Python. В то время как код Java в этом примере является определенным для корпоративных компонентов, процесса для того, чтобы разработать клиент CORBA, который получает доступ к создаваемому использованию сервера API IIOP RMI Java, то же самое.
Ссылки к подобным приложениям в качестве примера от других поставщиков, которые реализуют технологию J2EE, могут быть найдены в Ссылках к подобным примерам.
Это - пример того, как разработать клиентское приложение CORBA, которое получает доступ к компоненту EJB. В этом примере клиент пишется на языке программирования на C++, но клиент мог быть записан на любом языке, поддерживаемом CORBA.
Общий процесс для того, чтобы разработать клиент CORBA так, чтобы это могло получить доступ к корпоративному компоненту, демонстрируется в следующих разделах:
Чтобы сделать пример простым, мы взяли несколько ярлыков. Для получения информации о создании более усовершенствованных решений см. Подсказки для сложных интерфейсов.
Следующие примеры показывают код для корпоративного компонента, который примет простой String
зарегистрируйте сообщения, отправленные серверу приложений от IIOP RMI Java и клиентов CORBA. Корпоративный компонент печатает их на сервере наряду с текущим временем сервера.
Logger.java
, LoggerHome.java
, LoggerEJB.java
, и LogMessage.java
в /Java/src/ejbinterop
каталог.
Файл Logger.java
удаленный интерфейс корпоративного компонента, и как таковой, он расширяется EJBObject
. Удаленный интерфейс обеспечивает удаленное клиентское представление объекта EJB и определяет бизнес-методы, вызываемые удаленным клиентом.
//Code Example 1: Logger.java package ejbinterop; import javax.ejb.EJBObject; import java.rmi.RemoteException; /** * Accepts simple String log messages and prints * them on the server. */ public interface Logger extends EJBObject { /** * Logs the given message on the server with * the current server time. */ void logString(String message) throws RemoteException; }
Файл LoggerHome.java
расширяется EJBHome
. EJBHome
интерфейс должен быть расширен удаленными домашними интерфейсами всего компонента EJB. Домашний интерфейс определяет методы, которые позволяют удаленному клиенту создавать, находить, и удалять объекты EJB, так же как размещать бизнес-методы, которые не являются определенными для экземпляра EJB.
//Code Example 2: LoggerHome.java package ejbinterop; import java.rmi.RemoteException; import javax.ejb.EJBHome; import javax.ejb.CreateException; public interface LoggerHome extends EJBHome { Logger create() throws RemoteException, CreateException; }
Файл LoggerEJB.java
содержит код для боба сеанса. Боб сеанса является корпоративным компонентом, который создается клиентом, и это обычно существует только для продолжительности единственного сеанса клиент-сервер. Боб сеанса выполняет операции, такие как вычисления или доступ к базе данных для клиента. В этом примере корпоративный компонент принимает простой String
зарегистрируйте сообщения от клиента, и печатает их на сервере.
//LoggerEJB.java package ejbinterop; import javax.ejb.*; import java.util.*; import java.rmi.*; import java.io.*; /** * Accepts simple String log messages and prints * them on the server. */ public class LoggerEJB implements SessionBean { public LoggerEJB() {} public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} /** * Logs the given message on the server with * the current server time. */ public void logString(String message) { LogMessage msg = new LogMessage(message); System.out.println(msg); } }
Файл LogMessage.java
берет текущую дату и время, создает отформатированный String
показ сообщения, и печатных изданий сообщение к серверу.
//LogMessage.java package ejbinterop; import java.io.Serializable; import java.util.Date; import java.text.*; /** * Simple message class that handles pretty * printing of log messages. */ public class LogMessage implements Serializable { private String message; private long datetime; /** * Constructor taking the message. This will * take the current date and time. */ public LogMessage(String msg) { message = msg; datetime = (new Date()).getTime(); } /** * Creates a formatted String showing the message. */ public String toString() { StringBuffer sbuf = new StringBuffer(); DateFormat dformat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG); FieldPosition fpos = new FieldPosition(DateFormat.DATE_FIELD); dformat.format(new Date(datetime), sbuf, fpos); sbuf.append(": "); sbuf.append(message); return sbuf.toString(); } }
javac -classpath $J2EE_HOME/lib/j2ee.jar:.. *.java
Эти команды создают class
файлы для всего из .java
файлы в текущем каталоге. Эта команда и другие в этой газете предполагают, что переменная окружения J2EE_HOME была установлена правильно. Используя $J2EE_HOME соглашение операционной среды Unix®. Замените %J2EE_HOME %, работая в операционной среде Microsoft Windows.
Это разделяет, обсуждает генерирование Языка определения интерфейсов (IDL) файлы от файлов класса Java, сгенерированных в предыдущем разделе. В этом примере мы будем использовать rmic
компилятор, чтобы отобразить код Java на IDL. IDL обеспечивает просто декларативный, программирующий независимый от языка способ определить API объекта.
rmic
компилятор против файлов класса Java, сгенерированных в предыдущем шаге следующим образом:
rmic -idl -noValueMethods -classpath $J2EE_HOME/lib/j2ee.jar:<path_to_ejbinterop_dir> -d <path_to_where_idl_files_should_be_generated> ejbinterop.Logger ejbinterop.LoggerHome
В предыдущем примере мы включаем файл JAR, содержащий определения для javax.ejb
пакет так же как каталог к нашему ejbinterop
файлы. Если Вы используете JavaTM 2 Платформы, Enterprise Edition (J2EETM), Ссылочная Реализация версии 1.3 (RI), файлы JAR располагаются в $J2EE_HOME/lib/j2ee.jar
.
В командной строке для rmic
выше, мы рекомендуем ярлык - использование noValueMethods
опция. Эта опция говорит rmic
пропускать любые методы с параметром или типами возврата, которые были бы отображены на типы значения CORBA. Преимущество состоит в том, что это будет препятствовать тому, чтобы мы генерировали много ненужного IDL, который нам, возможно, придется реализовать в клиенте C++. Недостаток - то, что мы можем только использовать примитивные типы данных, массивы, и Strings
как параметры или возвращаемые значения, и не наши собственные типы классов Java. Читайте больше об этом в Подсказках для сложных интерфейсов
Выполнение rmic
компилятор на файлах класса Java генерирует следующие файлы к каталогу, обозначенному с-d опцией в rmic
оператор выше:
java/lang/Ex.idl
java/lang/Exception.idl
java/lang/Object.idl
java/lang/Throwable.idl
java/lang/ThrowableEx.idl
javax/ejb/CreateEx.idl
javax/ejb/CreateException.idl
javax/ejb/EJBHome.idl
javax/ejb/EJBMetaData.idl
javax/ejb/EJBObject.idl
javax/ejb/Handle.idl
javax/ejb/HomeHandle.idl
javax/ejb/RemoveEx.idl
javax/ejb/RemoveException.idl
ejbinterop/Logger.idl
ejbinterop/LoggerHome.idl
EJBMetaData
реализация является в настоящий момент определенной для каждого сервера приложений, и таким образом будет трудно разработать эквиваленты, которые будут продолжать работать в течение долгого времени над платформами кроме платформы Java. Одна опция должна удалить их из IDL, но если Вы делаете, необходимо удалить их из IDL каждый раз, когда Вы изменяетесь, Java соединяют интерфейсом и регенерируют файлы IDL от rmic
компилятор.ОТМЕТЬТЕ: Так как исключения CORBA не поддерживают наследование, язык Java к отображению IDL создает Ex
класс, который содержит тип значения CORBA, представляющий фактическое исключение Java. В этом основном примере мы не собираемся волноваться очень о поддержке исключения. Больше информации об исключениях может быть найдено в
Клиентское приложение может быть записано на любом языке, поддерживаемом CORBA. Следующий пример предоставляет код простому клиенту C++ что учитывая Посредника запросов к объектам (ШАР) и a corbaname
URL для a LoggerHome
объект, регистрирует простое String
сообщение на сервере. Необходимо корректироваться include
операторы и изменяют код для того, чтобы зарегистрировать фабрики значения, основанные на Ваших библиотеках поставщика ШАРА C++. Этот пример был записан для ORBacus для C++ 4.0.5, и часть кода C++ в этом примере является определенной для того продукта.
A corbaname
URL является удобочитаемым форматом URL, который включает Вам к доступу объекты CORBA. Это используется, чтобы разрешить имя stringified от определенного контекста именования. Это - часть Взаимодействующей Службы Именования CORBA (INS). INS является расширением Служб Объекта CORBA (COS) Служба Именования, которая была поставлена в предыдущих выпусках платформы J2EE. Чтобы читать больше о INS, посетите Взаимодействующую Службу Именования.
В этом примере клиентский код делает следующее:
LoggerHome
объект в контексте именования, на который указывают corbaname
URL.LoggerHome
объект.LoggerEJB
ссылка на объект.//Code Example: Client.cpp #include <fstream.h> // C++ ORB Vendor specific include files // These are from C++ ORBacus 4.0.5 #include <OB/CORBA.h> #include <OB/OBORB.h> // Include files generated from our IDL #include <java/lang/Exception.h> #include <java/lang/Throwable.h> #include <javax/ejb/CreateException.h> #include <javax/ejb/RemoveException.h> #include <ejbinterop/Logger.h> #include <ejbinterop/LoggerHome.h> /** * Given an ORB and a corbaname URL for a LoggerHome * object, logs a simple string message on the server. */ void run(CORBA::ORB_ptr orb, const char* logger_home_url) { cout << "Looking for: " << logger_home_url << endl; // Look up the LoggerHome object in the naming context // pointed to by the corbaname URL CORBA::Object_var home_obj = orb->string_to_object(logger_home_url); // Perform a safe downcast ejbinterop::LoggerHome_var home = ejbinterop::LoggerHome::_narrow(home_obj.in()); assert(!CORBA::is_nil(home)); // Create a Logger EJB reference ejbinterop::Logger_var logger = home->create(); CORBA::WStringValue_var msg = new CORBA::WStringValue((const CORBA::WChar*)L"Message from a C++ client"); cout << "Logging..." << endl; // Log our message logger->logString(msg); // Tell the application server we won't use this // EJB reference any more logger->remove(); cout << "Done" << endl; } /** * Simple main method that checks arguments, creates an * ORB, and handles exceptions. */ int main(int argc, char* argv[]) { int exit_code = 0; CORBA::ORB_var orb; try { // Check the arguments if (argc != 2) { cerr << "Usage: Client <corbaname URL of LoggerHome>" << endl; return 1; } // Create an ORB orb = CORBA::ORB_init(argc, argv); // Register value factories // NOTE: This is overkill for the example since we'll never // get these exceptions. Also, the _OB_id method is a // proprietary feature of ORBacus C++ generated code. CORBA::ValueFactory factory = new java::lang::Throwable_init; orb -> register_value_factory(java::lang::Throwable::_OB_id(), factory); factory -> _remove_ref(); factory = new java::lang::Exception_init; orb -> register_value_factory(java::lang::Exception::_OB_id(), factory); factory -> _remove_ref(); factory = new javax::ejb::CreateException_init; orb -> register_value_factory(javax::ejb::CreateException::_OB_id(), factory); factory -> _remove_ref(); factory = new javax::ejb::RemoveException_init; orb -> register_value_factory(javax::ejb::RemoveException::_OB_id(), factory); factory -> _remove_ref(); // Perform the work run(orb, argv[1]); } catch(const CORBA::Exception& ex) { // Handle any CORBA related exceptions cerr << ex._to_string() << endl; exit_code = 1; } // Release any ORB resources if (!CORBA::is_nil(orb)) { try { orb -> destroy(); } catch(const CORBA::Exception& ex) { cerr << ex._to_string() << endl; exit_code = 1; } } return exit_code; }
LoggerEJB
компонент используя J2EE 1.3 Ссылочных Реализации (RI).
$J2EE_HOME/bin/j2ee -verbose
$J2EE_HOME/bin/deploytool
File
->
New
->
Application.
Logger.ear
указать в который файл создать приложение.Logger
File
->
New
->
Enterprise Bean.
.class
файлы от нашего ejbinterop
пакет: Logger.class
, LoggerHome.class
, LoggerEJB.class
, LogMessage.class
. Выберите OK, тогда Затем.Stateless
Session
Bean
Type.
ejbinterop.LoggerEJB
для Enterprise
Bean
Class
.ejbinterop.LoggerHome
для Remote
Home
Interface
.ejbinterop.Logger
для Remote
Interface
.Security
Settings
страница.Deployment
Settings
кнопка.
Support
Client
Choice
.Tools
->
Deploy.
ejbinterop/logger
в JNDI
Name
для нашего поля LoggerEJB.Теперь, приложение Регистратора с нашим LoggerEJB
компоненты развертываются и готовы получить сообщения.
Client corbaname:iiop:1.2@localhost:1050#ejbinterop/logger
Client
имя приложения, чтобы работать.corbaname
определяет, что мы разрешим имя stringified от определенного контекста именования.iiop:1.2
говорит ШАРУ использовать протокол IIOP и GIOP 1.2.localhost
, локальная машина. Чтобы развернуть этот пример, чтобы работать на двух машинах, введите IP-адрес или имя хоста машины, на которой сервер работает вместо localhost
.1050
порт, на котором служба именования прислушивается к запросам. По умолчанию в J2EE v.1.3 RI, порт по умолчанию, на котором слушает служба именования, является портом 1050. Часть ссылки до этой точки в знаке "диез" (Client corbaname:iiop:1.2@localhost:1050
) URL, который возвращает корневой контекст именования.ejbinterop/logger
имя, чтобы решить в контексте именования.Если Вы используете J2EE 1.3 Ссылочных Реализации, следует видеть сообщение, подобное следующему, напечатанному на сервере приложений:
Sep 21, 2001 3:33:07 PM PDT: Message from a C++ client ejbinterop/
logger
is the name to be resolved from the Naming Service.
$J2EE_HOME/bin/j2ee -stop
Процедуры для того, чтобы прекратить выполнять процессы изменяются среди операционных систем, так, если Вы выполняете различный сервер, консультируйтесь со своей системной документацией для деталей.
Используя тот же самый пример, мы можем легко разработать клиент IIOP RMI Java, который соединяется с корпоративным компонентом. Различия от примера, используя клиент C++:
Return Client Jar
в Deploytool на первой странице экрана Deploy.Следующий код является версией IIOP RMI Java клиента для нашего LoggerEJB
компонент. Следуйте за теми же самыми шагами как представленные для клиентского примера C++. Выполняя клиент, используйте тот же самый URL в качестве в примере C++.
//Code Example: LogClient.java package ejbinterop; import java.rmi.RemoteException; import javax.rmi.*; import java.io.*; import javax.naming.*; import javax.ejb.*; /** * Simple Java RMI-IIOP client that uses an EJB component. */ public class LogClient { /** * Given a corbaname URL for a LoggerHome, * log a simple String message on the server. */ public static void run(String loggerHomeURL) throws CreateException, RemoveException, RemoteException, NamingException { System.out.println("Looking for: " + loggerHomeURL); // Create an InitialContext. This will use the // CosNaming provider we will specify at runtime. InitialContext ic = new InitialContext(); // Lookup the LoggerHome in the naming context // pointed to by the corbaname URL Object homeObj = ic.lookup(loggerHomeURL); // Perform a safe downcast LoggerHome home = (LoggerHome)PortableRemoteObject.narrow(homeObj, LoggerHome.class); // Create a Logger EJB reference Logger logger = home.create(); System.out.println("Logging..."); // Log our message logger.logString("Message from a Java RMI-IIOP client"); // Tell the application server we won't use this // EJB reference anymore logger.remove(); System.out.println("Done"); } /** * Simple main method to check arguments and handle * exceptions. */ public static void main(String args[]) { try { if (args.length != 1) { System.out.println("Args: corbaname URL of LoggerHome"); System.exit(1); } LogClient.run(args[0]); } catch (Throwable t) { t.printStackTrace(); System.exit(1); } } }
Запуская приложение в качестве примера с клиентом IIOP RMI Java вместо клиента C++, следуйте за этими шагами:
java
файлы в ejbinterop
/ каталог со следующей командой:
javac -classpath $J2EE_HOME/lib/j2ee.jar:<ejbinterop_directory> *.java
java -classpath $J2EE_HOME/lib/j2ee.jar: <path to LoggerClient.jar>/LoggerClient.jar: <directory_above_ejbinterop>:<ejbinterop_directory> ejbinterop.LogClient corbaname:iiop:1.2@localhost:1050#ejbinterop/logger
В окне, в котором работает RI J2EE, Вы будете видеть это:
Jan 31, 2002 2:27:47 PM PST: Message from a Java RMI-IIOP client
В окне от того, куда клиент выполняется, Вы будете видеть это:
Looking for: corbaname:iiop:1.2@localhost:1050#ejbinterop/logger
Logging...
Done
Этот раздел содержит следующую информацию:
Чтобы улучшить приложение, Вы могли:
Чтобы сделать это, удалите -noValueMethods
переключитесь, когда Вы работаете rmic
. Запустите повторно свой IDL к компилятору отображения языка C++, чтобы проверить, что это поддерживает valuetypes, которые были сгенерированы.
Logger
это фактически берет a LogMessage
.Интерфейсы являются ключевыми к передаче между клиентами и серверами, говоря на различных языках. Чтобы увеличить вероятность успеха в этой области, рассмотрите следующие предложения:
java.util
, для параметров метода или типов возврата.После того, как эти типы отображаются на IDL, Вы будете вынуждены реализовать их в своем клиентском языке программирования. Кроме того, так как Сериализация Объекта Java и API IIOP RMI позволяют проводному формату и внутреннему представлению классов развиваться в течение долгого времени, Ваши клиентские приложения CORBA могут быть несовместимыми через JavaTM 2 Платформы, Standard Edition (J2SETM) реализации или версии.
Можно хотеть сложные структуры данных в своих типах возврата или параметрах метода. В этом случае попытайтесь запустить с IDL. Определите структуры данных и даже исключения в IDL, и затем используйте их в своих интерфейсах EJB. Это будет препятствовать тому, чтобы артефакты обратного отображения ползали в Ваши интерфейсы CORBA.
Например, попытайтесь определить LogMessage
класс в IDL первоначально, и затем использование получающегося класса языка Java к компиляции IDL как параметр метода в Регистраторе компонент EJB.
IDL CORBA не поддерживает перегрузку метода, и язык Java к IDL, отображающему спецификацию, обрабатывает это, создавая определения метода IDL, которые комбинируют имя метода со всеми его типами параметра IDL. Это приводит к очень недружелюбным именам методов для разработчиков, использующих языки кроме языка программирования Java.
Если доступные параметры все еще слишком ограничиваются или воздействуют на код, Вы хотите записать, рассмотреть использование моста серверной стороны. Можно читать больше о построении таких мостов от сайтов, перечисленных в разделе ссылок.
У нескольких поставщиков, реализующих технологию J2EE, есть превосходные примеры и подсказки для того, чтобы интегрировать CORBA и Предприятие технология JavaBeans: