Передача объектов данных между Java-средами CICS: Часть 3: Транспортировка объектов данных Java из клиентской транзакционной Java-программы CICS в Java-программу CICS TS

Java становится популярным языком программирования CICS-приложений. CICS предоставляет несколько Java-сред, каждая из которых имеет свои сильные стороны, поэтому передача объектов данных между различными Java-средами CICS ― важная задача. Этот цикл из трех статей посвящен данной теме. В Части 3 рассматривается API, который позволяет клиентским Java-программам CICS TG взаимодействовать с программой CICS TS. В ней описан также транспортер объектов, который можно использовать в Java-клиенте CICS TG, и мастера Rational Application Developer, генерирующие код, который устанавливает связь между Java-клиентом CICS TG и программой CICS TS.

Деннис Уэйенд, технический специалист по работе с пользователями CICS, Web и Java, группа технического обеспечения продаж, IBM

Фото Денниса УэйендаДеннис Уэйенд (Dennis Weiand) работает техническим специалистом по CICS, Web и Java в группе технического обеспечения продаж IBM в Далласе (штат Техас, США). С ним можно связаться по адресу: dweiand@us.ibm.com.



20.08.2012

Введение

В Части 1 этого цикла из трех статей рассматривались различные Java™-среды, которые предоставляет IBM® CICS®:

  • традиционная обобщенная среда JVM, в которой в каждый момент времени может выполняться только одна Java-транзакция на базе CICS;
  • среда JVM-сервера CICS, в которой несколько запросов Java-программ могут выполняться в одной и той же JVM одновременно. Следующие Java-среды, предоставляемые CICS, используют сервер JVM (но их нельзя смешивать в одном JVM-сервере):
    • среда на основе OSGi, которая обеспечивает систему динамических модулей OSGi с такими функциями, как динамическое добавление в JVM и удаление Java-классов, ведение реестра OSGi, предоставление Java-модулю только интерфейсов, а не классов модуля целиком, и определение зависимостей между модулями, что практически исключает типичные проблемы ClassNotFound;
    • механизм Web-сервисов с открытым исходным кодом Axis2, который позволяет быстро и легко представлять POJO с помощью аннотаций JAX-WS и писать обработчики в стиле Axis2;
    • CICS Dynamic Scripting ― быстрый способ разработки Web-приложений с использованием языков сценариев PHP и Groovy. Интерпретаторы PHP и Groovy реализованы на Java, так что этот Java-мост позволяет создавать экземпляры объектов Java и вызывать CICS-программы;
  • CICS Transaction Gateway (CICS TG), который облегчает сообщение между Java-программой, работающей в не-CICS среде, и программой CICS Transaction Server (CICS TS).

Конечно, если работать с классами Java в рамках одной Java-программы на основе CICS, то следует поступать обычным образом: создавать экземпляры объектов и вызывать методы этих объектов. Однако если приложение написано на языке Java и вы хотите использовать преимущества разных Java-сред, предоставляемых CICS, или если нужно распределить отдельные части Java-приложения между несколькими областями CICS, Java-подход к транспортировке объектов данных Java предпочтительнее традиционного поле-ориентированного подхода передачи данных в виде последовательности байтов. Этот традиционный подход к передаче данных необходим и хорошо работает при использовании нескольких языков программирования, что является одним из достоинств CICS.

В Части 1 говорилось о CICS-версии вызова, команде EXEC CICS LINK, которая позволяет вызывать другие программы, написанные на том же или на другом языке программирования в среде CICS. В архитектуре CICS для передачи данных между программами CICS применяются COMMAREA и каналы/контейнеры. COMMAREA представляет собой блок ячеек памяти емкостью до 32 КБ, а контейнер ― это именованный блок ячеек памяти без ограничения размера. Контейнеры группируются в канал, который можно передавать из одной CICS-программы в другую. COMMAREA и каналы/контейнеры ― взаимоисключающие методы: программа может получить данные только одним из них. При вызове программы В из программы А программа А может передать COMMAREA или канал, но не то и другое вместе.

При передаче данных между программами CICS они обычно помещаются поле-ориентированную структуру последовательных байтов. Программы, написанные на языке Java, могут участвовать в этой среде, но когда CICS-приложение написано только с использованием Java, программист Java-приложения найдет более удобным оставаться в объектно-ориентированном мире Java и передавать между Java-программами на основе CICS объекты данных Java. В Части 1 мы пришли к заключению, что если CICS-приложение написано только на Java и нужно переходить из одной Java-среды CICS в другую, то проще оставаться в парадигме Java и передавать между Java-средами на базе CICS объекты данных Java. Для этого нужно выполнить сериализацию объекта данных Java в контейнер CICS, передать контейнер в другую Java-программу, работающую в другой Java-среде CICS, а затем выполнить десериализацию объекта в целевой Java-программе.

В частях 1 и 2 объясняется, почему Java-программисту легче передавать между Java-программами на основе CICS объекты данных Java вместо традиционной поле-ориентированной последовательности байтов CICS, которая используется для передачи данных между программами, написанными на разных языках программирования. В Части 2 описан способ передачи объектов данных Java с использованием сериализации объектов и предоставляемых CICS Java-API для помещения данных в контейнеры CICS и их извлечения и для вызова одной CICS-программы из другой. В Части 2 также приведены Java-классы, которые показывают, как написать обобщенный объект Java, позволяющий передавать объекты данных Java между различными Java-средами CICS. Методика, описанная в Части 2, позволяет передавать объекты данных Java между Java-средами, предоставляемыми CICS, с помощью следующего подхода к программированию:

     String abc = "Some information to Pass";
     Employee emp = new Employee("John Doe");
     DDW_CicsObjectTransporter transporter = new 
          DDW_CicsObjectTransporter();
     transporter.addObject("abc",abc).
 addObject("emp",emp).
          execute("TARGET");

     // и после ответа программы

     String errorString = (String)transporter.getObject("error");
     If (errorString != null) {
          processError();
     } else {
          Manager newManager = (Manager)transporter.getObject("mgr");
          // обработка/отображение возвращенного объекта Manager
     }

Ниже приведен пример кода отвечающей Java-программы, которая возвращает данные:

DDW_CicsObjectTransporter transporter = new 
     DDW_CicsObjectTransporter();
Employee emp = (Employee)transporter.getObject("emp");
// работа с объектом employee 
transporter.removeObject("abc");    // может удалять объекты
Manger mgr = new Manger("Joe Bloggs");
transporter.addObject("mgr",mgr);  // добавление новых или измененных объектов
return;

Клиентская Java-программа CICS TG может обращаться к среде CICS TS с использованием каналов и контейнеров, поэтому те же методы передачи объектов данных Java между предоставленными CICS TS Java-средами, что описаны в Части 2, можно применять для передачи объектов данных Java между клиентской Java-программой CICS TG и Java-программой, работающей в CICS TS. На стороне CICS TS даже можно использовать тот же самый класс транспортера объектов, но на стороне Java-клиента CICS TG потребуется другая реализация транспортера объектов с учетом особенностей программирования API CICS TG.

Эта статья (Часть 3) посвящена API, который позволяет клиентским Java-программам CICS TG взаимодействовать с программой CICS TS. В ней описан также транспортер объектов, который можно использовать в Java-клиенте CICS TG наряду с мастерами Rational Application Developer System z для создания кода, устанавливающего связь между Java-клиентом CICS TG и программой CICS TS.

Мастера, предоставляемые с Rational Application Developer, как правило, принимают в качестве входных данных тетрадь COBOL и создают код для выполнения маршалинга данных, которые преобразуются в COBOL-подобную поле-ориентированную последовательность байтов. Два основных преимущества этого подхода заключаются в том, что клиентская Java-программа CICS TG может передавать данные в программу, написанную на COBOL, PL/I, C, C++, Java или языке ассемблера, работающую в CICS TS, и это работает быстро. Однако если клиентская и серверная программы написаны на языке Java, программисту Java-приложений будет проще использовать Java-подобную парадигму и передавать между программами Java-клиента и Java-сервера объекты данных Java. В этой статье показано, как применять предоставленный транспортер объектов с мастерами Rational Application Developer, пользуясь преимуществом генерирования кода из мастеров и удобным для программиста Java-приложений способом передачи объектов данных Java.

Как говорилось выше, цель этого цикла статей ― сделать передачу объектов данных между различными предоставляемыми CICS Java-средами удобной для программиста Java-приложений. Поскольку сериализация и десериализация объектов Java влечет за собой некоторые накладные расходы, необходимо проверить производительность полученного приложения, чтобы убедиться, что этот способ передачи данных объектов Java соответствует вашим требованиям. Вопросы сериализации объектов Java подробно рассматриваются в Части 2.

CICS Transaction Gateway

CICS TG обеспечивает безопасную транзакционную связь между клиентскими программами, написанными на разных языках программирования, таких как C#, Java, Microsoft®.NET, Microsoft Visual Basic, PowerBuilder и COBOL для рабочих станций, с программой, работающей в CICS TS.

Для Java-клиента, работающего в не-CICS среде, CICS TG реализует архитектуру Java Connector Architecture(JCA), которая определяет стандартный способ связи Java-программ с корпоративными информационными системами (EIS), такими как CICS, IMS, JDEdwards, PeopleSoft и SAP. JCA определяет способ реализации управляемых или неуправляемых соединений, используя стандартный API Common Client Interface (CCI). С помощью управляемого соединения сервер приложений Java Enterprise Edition (JEE) может управлять соединением, обработкой транзакций и распространением контекста безопасности. Этот стандартный API CCI позволяет Java-программисту использовать общий API для доступа к различным EIS.

CICS TG можно настроить на разные конфигурации – см. Информационный центр CICS TG.

Для сценариев, в которых клиентская программа CICS TG написана на Java, и серверная бизнес-логика CICS также реализована на Java, методы, приведенные в этой статье, можно использовать для передачи данных Java-объектов из клиентской программы CICS TG в Java-программу на основе CICS, реализующую бизнес-логику.

Передача объектов Java из Java-клиента CICS TG в Java-программу на базе CICS

Для работы с CICS ТG и каналами/контейнерами имеются два API: оригинальный API, предложенный в 1996 году, когда CICS TG впервые начал поддерживать Java, и добавленный позднее JCA API (или Common Client Interface - CCI). Оба API поддерживают каналы и контейнеры, но в данной статье рассматривается CCI, потому что это стратегический API для CICS ТG. За дополнительной информацией по использованию CCI с CICS TG обращайтесь к IBM Redbook Разработка связующих приложений для CICS и двум статям в developerWorks Фила Уэйклина: Exploiting the J2EE Connector Architecture и Exploiting CICS channels and containers from Java clients.

При написании Java-клиента CICS TG с использованием CCI программист работает с классом ECIChannelRecord, который предоставляет канал и содержит методы для работы с контейнерами в канале. Вместо классов Channel и Container, которые обсуждались в Части 2 в применении к программам CICS TS, в клиентских Java-программах CICS TG применяется ECIChannelRecord.

ECIChannelRecord содержит методы для контейнеров put(), get() и delete(), тогда как для CICS TS используются методы put() и get() с объектом Container, а удаление контейнера производится с помощью метода deleteContainer(). Кроме того, для методов CICS TG и методов CICS TS по-разному выполняется проверка ошибок. Существуют контейнеры двух типов: BIT и CHAR (см. Часть 1). Процесс создания и доступа к контейнерам BIT и CHAR с помощью предоставляемого CICS ТG объекта ECIChannelRecord отличается от использования объекта Channel, предоставляемого CICS TS. Кроме того, в Java-программе CICS TS для вызова программы используется объект Program и метод link(), а в клиентской Java-программе CICS TG ― метод execute() объекта Interaction, полученный из Connection (см. ниже).

Сериализация и десериализация объектов выполняется одинаково для любой реализации Java, поэтому в транспортерах CICS ТG и CICS TS можно использовать один и тот же код сериализации и десериализации объектов. Методы извлечения, добавления и удаления Java-объектов для обоих транспортеров одинаковы, что обеспечивает единообразный интерфейс. Но внутреннее взаимодействие с объектами Channel/Container и с объектом ECIChannelRecord происходит по-разному.

DDW_CicsObjectTransporter (см. Часть 2) обеспечивает тонкую надстройку над существующей инфраструктурой каналов и контейнеров CICS TS. Для транспортера объектов CICS TG класс ECIChannelRecord дополнен до DDW_CicsTg_ObjectTransporter, что позволяет использовать DDW_CicsTg_ObjectTransporter везде, где может использоваться ECIChannelRecord, в том числе в мастерах CCI и Rational Application Developer. Ниже приводятся примеры того и другого.

Использование CCI в клиентской Java-программе CICS TG

Если программист Java-клиента CICS TG напишет CCI самостоятельно, а не сгенерирует код с помощью мастеров Rational Application Developer, то он будет похож на приведенный ниже фрагмент. CCI довольно прост: сначала создается или извлекается из пула соединений объект соединения. Из соединения создается объект Interaction, и с помощью метода execute() объекта Interaction вызывается серверная программа. Эти части CCI одинаковы для любой серверной системы - CICS, IMS, JDEdwards и т.п.

Часть CCI, зависящая от серверной системы, ― это спецификация (специфика) взаимодействия и формат передаваемых данных. Для вызова программы на основе CICS используется спецификация взаимодействия ECIInteractionSpec, которая содержит имя вызываемой CICS-программы, идентификатор и пароль пользователя и другие детали взаимодействия с CICS-программой. В приведенном ниже примере передается ECIChannelRecord, содержащий контейнеры, передаваемые или извлекаемые из программы CICS TS. Механизм каналов и контейнеров предназначен для CICS TS и не используется с другими EIS-системами:

ConnectionFactory cf = createAConnectionFactory();  // неуправляемое соединение
Connection conn = cf.getConnection();
Interaction interaction = conn.createInteraction();
byte [] someBytes = "some characters".getBytes();   // байты контейнера 
ECIChannelRecord myChannel = new ECIChannelRecord(CHANNEL_NAME);
myChannel.put(REQUEST_INFO_CONTAINER, someBytes);  // контейнер BIT
ECIInteractionSpec ixnSpec = getMyECIInteractionSpec();
interaction.execute(ixnSpec, myChannel, myChannel);  // вызов целевой программы

Обратите внимание на объект ECIChannelRecord в приведенном выше коде, который представляет собой канал, и на метод put() объекта ECIChannelRecord, в котором определяется имя контейнера и его содержимое. Когда в контейнер ECIChannelRecord помещается массив байтов, тот становится контейнером типа BIT. Над контейнерами типа BIT ни CICS TS, ни CICS TG никаких преобразований не выполняют. В верхней части фрагмента кода создается фабрика соединений для неуправляемого соединения - для упрощения примера кода. В программе WebSphere Application Server или WebLogic Java соединение извлекалось бы из пула соединений, управляемого сервером приложений, с помощью поиска по JNDI. При использовании пула соединений, управляемого сервером приложений (управляемое соединение) сервер приложений может помочь в ведении пула соединений, регулируя транзакциональность и распространяя на программу CICS TS контекст безопасности.

В приведенном выше примере кода конструирование ECIInteractionSpec поручается методу getMyECIInteractionSpec(). Этот метод создает ECIInteractionSpec и назначает соответствующие свойства (имя программы CICS TS, идентификатор и пароль пользователя и т. д.). Подробнее о создании ECIInteractionSpec см. в Информационном центре CICS TG и двух статях Фила Уэйклина (Phil Wakelin) в developerWorks: Exploiting the J2EE Connector Architecture и Exploiting CICS channels and containers from Java clients.

Использование класса DDW_CicsTg_ObjectTransporter с CCI

Чтобы использовать класс DDW_CicsTg_ObjectTransporter для передачи Java-объектов в Java-программы CICS TS, нужно изменить приведенный выше код, как показано ниже, так как класс DDW_CicsTg_ObjectTransporter расширяет ECIChannelRecord. Единственное отличие заключается в том, что для сериализации заданного объекта Java и его добавления в контейнер используется метод addObject() класса DDW_CicsTg_ObjectTransporter. Метод execute() определяет допустимый транспортер объектов, поскольку он расширяет класс ECIChannelRecord. По возвращении из Java-программы CICS TS для доступа к возвращенному объекту данных Java используется метод транспортера объекта getObject().

DDW_CicsTg_ObjectTransporter transporter = new DDW_CicsTg_ObjectTransporter();
String inputData = "12345";
transporter.addObject("inputData", inputData);
// и 
ConnectionFactory cf = createAConnectionFactory();  // неуправляемое соединение
Connection conn = cf.getConnection();
Interaction interaction = conn.createInteraction();
ECIInteractionSpec ixnSpec = getMyECIInteractionSpec();
interaction.execute(ixnSpec, transporter, transporter);  // вызов целевой программы
// и
String responseData = (String)transporter.getObject("responseData");

Как и прежде, в приведенном выше примере кода конструирование ECIInteractionSpec поручается методу getMyECIInteractionSpec().

DDW_CicsTg_ObjectTransporter можно применять в любом примере кода с использованием ECIChannelRecord.

Использование DDW_CicsTg_ObjectTransporter с мастерами Rational Application Developer

Как видите, API CCI довольно прост, но применение мастеров J2C в Rational Application Developer чрезвычайно популярно. Они используют ECIChannelRecord, поэтому когда класс ECIChannelRecord расширяется до DDW_CicsTg_ObjectTransporter, можно использовать DDW_CicsTg_ObjectTransporter с мастерами Rational Application Developer.

Кроме того, с помощью мастеров Rational Application Developer можно создать объект, который использует неуправляемое соединение (как показано в приведенных выше фрагментах кода) или извлекает соединение CICS TG из пула соединений, предоставляемого сервером приложений Java (например, WebSphere Application Server или WebLogic). Применение пула соединений CICS TG, предоставляемого сервером приложений Java, позволяет использовать возможности сервера приложений Java по управлению пулом соединений CICS TG, обеспечению транзакциональности и распространению на CICS контекста безопасности.

Ниже перечислены шаги по использованию мастеров Rational Application Developer, но вы можете скопировать приведенный класс DDW_CicsTg_ObjectTransporter целиком в свой проект в Rational Application Developer, вызвать мастер J2C => J2C Bean и

  1. Указать, используете ли вы управляемое или неуправляемое соединение. Если управляемое, то укажите имя JNDI пула соединений CICS TG.
  2. На второй странице мастера указать имя проекта, имя пакета, содержащего сгенерированный код, и интерфейс и имя реализации сгенерированного кода.
  3. На третьей странице мастера указать имя метода, который нужно добавить к сгенерированному коду. Нажмите кнопку Add, чтобы войти в подмастер, где нужно указать имя класса и DDW_CicsTG_ObjectTransporter для ввода данных.
  4. На следующей странице указать имя целевой программы, которая должна вызываться в CICS TS как имя функции, а затем нажать кнопку Finish.

В следующем разделе показано, как использовать DDW_CicsTg_ObjectTransporter с мастерами J2C Rational Application Developer. Мастера не установлены в Rational Application Developer по умолчанию – нужно запросить них установку или добавление.

  1. Создайте Java-проект или динамический Web-проект и дайте ему имя, например CICSTG-FUNDPROG-Client.
  2. Скопируйте в свой проект com.ibm.ddw.cicstg.object.transporter.DDW_CicsTg_ObjectTransporter и com.ibm.ddw.cicstg.object.transporter.DDW_CicsTg_ObjectTransporterException (оба представлены в этой статье). Ссылки на некоторые классы J2C могут оказаться неработающими. DDW_CicsTg_ObjectTransporter не будет виден в мастерах J2C, пока не заработают все ссылки. Ссылки можно исправить несколькими способами:
    • если в рабочей области уже есть проект CICS TG ECI (имя проекта будет примерно таким: cicseci8001), этот проект можно добавить в путь сборки проекта: щелкните правой кнопкой мыши на проекте и выберите из контекстного меню Build Path => Java Build Path. На вкладке Projects добавьте в путь сборки проекта проект CICS TG ECI Adapter;
    • если в рабочей области еще нет проекта CICS TG ECI Adapter, его можно добавить, запустив мастер через J2C Bean и создав фиктивную реализацию. Затем классы фиктивной реализации можно удалить;
    • чтобы выполнить фиктивную реализацию, щелкните правой кнопкой мыши на проекте и выберите New => Other, затем выберите J2C => J2C Bean. На странице Resource Adapter Selection выберите ECIResourceAdapter и нажмите кнопку Next. На странице Connector Import укажите целевой сервер WebSphere Application Server V7.0 и нажмите кнопку Next. На странице Connection Properties выберете управляемое (Managed) или неуправляемое соединение в зависимости от требуемой среды. На странице J2C Java Bean Output Properties укажите имя фиктивного пакета и фиктивного интерфейса и нажмите Finish. После завершения работы мастера в рабочей области должен появиться проект CICS TG Adapter с именем, подобным cicseci8001, и этот же проект должен быть указан в пути сборки проекта. Удалите созданный фиктивный пакет, интерфейс и класс реализации.
  3. После применения любого из указанных выше способов исправления ссылок в классе DDW_CicsTg_ObjectTransporter в рабочей области должны находиться следующие компоненты:
  4. Теперь, когда у вас есть проект TG CICS ECI Adapter, и он включен в путь сборки проекта, можно сгенерировать реальные интерфейс и класс реализации.
  5. Щелкните правой кнопкой на проекте и выберите New => Other. В диалоговом окне Select мастера выберите J2C => New J2C Bean и нажмите кнопку Next.
  6. В диалоговом окне New J2C Bean выберите проект CICS ECIResource Adapter, который уже был в рабочей области, или созданный только что:
  7. На странице Connections Properties диалогового окна New J2C Bean выберите управляемое или неуправляемое соединение и укажите его характеристики, затем нажмите кнопку Next. Настройка CICS TG выходит за рамки темы этой статьи - см. Информационный центр CICS ТG.
  8. На странице J2C Java Bean Output Properties диалогового окна New J2C Bean укажите имя пакета, который будет содержать созданные классы. В этой статье используется имя пакета com.ddw.cicstg.test и имя интерфейса FUNDPROG. Нажмите кнопку Next. FUNDPROG - это также имя вызываемой CICS-программы. Имя фактической программы CICS TS, которую нужно вызвать, указывается на одном из последующих шагов.
  9. На странице Java Methods диалогового окна New J2C Bean нажмите кнопку Add, чтобы указать имя метода, который будет создан в J2C Bean. Нажмите кнопку Add, чтобы открыть диалоговое окно Java Method.
  10. В диалоговом окне Java Methods укажите имя метода, который будет создан в J2C Bean. В этой статье используется имя invokeProgram. Нажмите кнопку Browse в графе Input type.
  11. В мастере Select a data type наберите вверху ddw, затем выберите DDW_CicsTg_ObjectTransporter и нажмите кнопку ОК.
  12. Возвратившись на страницу Java Method, нажмите кнопку Finish:
  13. На странице Java Methods укажите имя программы CICS, которую нужно вызывать как имя функции (в нашем случае это FUNDPROG), а затем нажмите кнопку Finish.

Написание клиентской Java-программы CICS TG с помощью реализации, созданной в J2C Wizards

Если при выполнении мастера Rational Application Developer имя вашей реализации (сгенерированного объекта) было FUNDPROGImpl, а в качестве имени добавляемого метода вы указали invokeProgram(), то сгенерированный код реализации клиентской Java-программы CICS TG можно вызывать, используя следующий фрагмент кода:

DDW_CicsTG_ObjectTransporter transporter = new DDW_CicsTG_ObjectTransporter();
String inputData = "12345";
transporter.addObject("inputData", inputData);
FUNDPROGImpl fundProg = new FUNDPROGImpl();  
// передача транспортера, прием транспортера
transporter = fundProg.invokeProgram(transporter); // invoke CICS TS program
String responseData = (String)transporter.getObject("responseData");
// работа с ответными данными

Такой подход имеет несколько преимуществ:

  1. Если указано управляемое соединение, то код, сгенерированный Rational Application Developer, будет использовать способность сервера Java-приложений управлять пулом соединений CICS TG, регулируя транзакциональность (если используется ECIXAResourceAdapter), и распространять контекст безопасности.
  2. Сгенерированный код будет внутренне использовать API JCA CCI, так что детали API CCI знать не нужно.
  3. Клиентская Java-программа CICS TG не занимается деталями соединения CICS TG.
  4. А лучше всего то, что транспортер объектов TG можно использовать из клиентской Java-программы CICS TG. В приведенном выше примере передается только один объект, но можно передавать сколько угодно объектов, и нет ограничений на тип объекта (постольку поскольку объекты реализуют интерфейс Serializable, как описано в Части 2).

Прием Java-объектов в обобщенную среду JVM CICS или JVMServer на базе OSGi

Следующий фрагмент кода можно использовать для получения Java-объектов из Java-клиента CICS TG в Java-программу на базе CICS TS, работающую в обобщенной среде JVM CICS или на JVM-сервере на основе CICS OSGi.

DDW_CicsObjectTransporter transporter = new 
     DDW_CicsObjectTransporter();
String inputData = (String)transporter.getObject("inputData");
// работа с объектом inputData
String responseData = "Whatever the response data is";
transporter.addObject("responseData", responsedata); // новый объект
return;

В приведенном выше коде используется класс DDW_CicsObjectTransporter, приведенный в Части 2. Все детали, связанные с DDW_CicsObjectTransporter, обсуждаются в Части 2.

Производительность

Сериализация и десериализация объектов влечет за собой некоторые накладные расходы. При использовании предоставленного транспортера объектов следует оценить производительность приложения на ранних стадиях разработки, чтобы убедиться, что она отвечает вашим требованиям. Хотя для передачи данных между Java-программами на основе CICS с использованием традиционного подхода поле-ориентированной последовательности байтов требуются запуск дополнительной утилиты и знание некоторых деталей процедурных языков, таких как COBOL или PL/I, этот традиционный подход может работать лучше.

В пример транспортера для этой статьи введена проверка ошибок, и по умолчанию большая часть этого механизма проверки ошибок включена. Для повышения производительности предоставленного примера кода транспортера можно использовать перечисленные ниже способы отключения проверки некоторых ошибок. Кроме того, по умолчанию при обнаружении ошибок несоответствия версий выдается предупреждение, и транспортер продолжает функционировать. Если вы хотите, чтобы в случае обнаружения удаленного транспортера другого уровня транспортер отключался, используйте метод setStopTransporterActivityIfLocalRemoteVersionsDifferent(true).

setCheckForTransporterErrorsInChannel(false);
     // не проверять ошибки предыдущих запросов
setCheckForSerialVersionUIDBeforeSerialization(false);
     // не отводить время на проверку поля serialVersionUID сериализуемых объектов
setCheckTheTransporterLevelWithWhichWeAreCommunicating(false);
     // не отводить время на проверку, находятся ли локальный и удаленный 
     // транспортер на одном и том же уровне

Как указывалось выше, транспортер объектов следует использовать только при перемещении данных между Java-средами на основе CICS. Оставаясь в рамках одной и той же Java-среды на основе CICS, используйте обычную технику Java-программирования, создавая экземпляры объектов и вызывая методы.

Класс DDW_CicsTg_ObjectTransporter предназначен для реализации техники, хорошо знакомой программисту Java-приложений, и для упрощения передачи объектов. Поскольку для программиста Java-приложений транспортер объектов столь прост в применении, велика вероятность небрежного отношения к нему. При передаче объектов, содержащих больше сведений, чем нужно, или если передаваемые объекты ссылаются на другие объекты, передавать которые не требуется, будет расходоваться лишнее время на сериализацию дополнительных данных и будут передаваться лишние данные; то и другое неоправданно увеличивает время реакции приложения.

Решение проблем передачи объектов

См. Часть 2.

Заключение

Эта статья (третья в цикле из трех статей) посвящена тому, как передавать объекты данных Java из Java-клиента CICS TG в Java-программу на базе CICS TS, работающую в среде JVM-сервера OSGi или в обобщенной среде JVM CICS.

  • Поскольку CICS TG позволяет передавать канал и контейнеры, тот же подход передачи сериализованных объектов, который рассматривался в Части 2, может использоваться и с CICS TG.
  • Хотя CICS TG может работать с каналом и контейнерами, API, используемый в клиентской программе CICS TG для взаимодействия с каналом и контейнерами, отличается от API, используемого в Java-программе CICS TS.
  • Для связи между клиентской Java-программой CICS TG и программой CICS используется API CCI JCA. API CCI можно включить непосредственно в код или использовать мастера Rational Application Developer для создания кода, реализующего соединение. Сгенерированный код может использовать возможности сервера приложений по управлению пулом соединений с областью CICS, регулированию транзакциональности и распространению контекста безопасности.
  • В этой статье приводится класс DDW_CicsTg_ObjectTransporter, который можно использовать в клиентской Java-программе CICS TG, способной взаимодействовать с DDW_CicsObjectTransporter в Java-программе CICS TS, передавая объекты данных Java.
  • В статье приводятся примеры кода, в которых DDW_CicsTg_ObjectTransporter используется с API CCI, а также подробные инструкции по использованию DDW_CicsTg_ObjectTransporter с мастерами J2C в Rational Application Developer.
  • Хотя классы DDW_CicsTg_ObjectTransporter и DDW_CicsObjectTransporter должны работать хорошо, они не проходили официального тестирования в IBM, и их следует рассматривать "как есть"; они предназначены только для иллюстрации идей, изложенных в этом цикле статей.

Для CICS-приложений, реализуемых исключительно на базе Java, попробуйте транспортер объектов и убедитесь, что этот подход действительно обеспечивает удобный способ передавать объекты данных Java между предоставленными CICS Java-средами. Этот подход предполагает сериализацию и десериализацию объектов и связанные с этим накладные расходы, поэтому проверьте свое приложение на производительность и убедитесь, что данный способ передачи объектов данных Java отвечает вашим требованиям.


Загрузка

ОписаниеИмяРазмер
Пример кодаcom.ibm.ddw.cicstg.object.transporter.zip15 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=WebSphere, Технология Java
ArticleID=831029
ArticleTitle=Передача объектов данных между Java-средами CICS: Часть 3: Транспортировка объектов данных Java из клиентской транзакционной Java-программы CICS в Java-программу CICS TS
publish-date=08202012