Форматы входных и выходных сообщений

Следует рассмотреть платформы, на которых работает целевое приложение хоста и клиент Java™, а также особые характеристики сообщений ввода и вывода при разработке приложения, которое использует IMS TM.

Созданное приложение Java работает на платформе (например, Windows, AIX и Solaris), отличной от платформы информационной системы предприятия (EIS). Администратор транзакций IMS(IMS TM) является прикладной программой IMS в z/OS). Из-за использования разных платформ текстовые данные в сообщениях следует преобразовать из стандарта UNICODE на стороне клиента в стандарт EBCDIC, используемый в приложении IMS.

В зависимости от значения Endian для платформы, на которой работает целевое приложение хоста, и страницы кода, которая используется системой хоста IMS, может понадобиться преобразование формата. По умолчанию это US English (037).

Рекомендация: Выполните преобразование формата с помощью интегрированной среды разработки (IDE). Например, мастер J2C в различных средах разработки WebSphere или Rational создает привязки данных Java из импортированных структур данных на C, COBOL и PL/I. Привязка данных выполняет преобразование формата сообщений в рабочей среде. Такие привязки данных создаются на основании опций, выбранных вами в мастере Импорта.

IMS требует добавлять в начало всех сообщений транзакции двухбайтовое поле LL, двухбайтовое поле ZZ и код транзакции, в указанном порядке. Поле LL задает длину сообщения. Поле ZZ содержит двоичный нуль. При вставке входных сообщений в IMS вы должны задать в поле LL размер входного сообщения, а в поле ZZ - 0.

Многосегментный вывод и вывод переменной длины

Если приложение IMS возвращает многосегментный вывод или вывод переменной длины, то с помощью определения OUTPUT-MSG языка COBOL можно определить вывод транзакции или создать для него выходное сообщение.

В следующем приложении на языке COBOL выходное сообщение, возвращаемое IMS, состоит из трех сегментов фиксированной длины. Общее выходное сообщение, возвращаемое этим приложением IMS, имеет фиксированный размер 99 байт и представляет собой OUTPUT-MSG - структуру COBOL 01. Длина OUTPUT-SEG1 - 16 байт, OUTPUT-SEG2 - 31 байт, OUTPUT-SEG3 - 52 байта.
LINKAGE SECTION.
		                                                   
	        01  INPUT-MSG.                                                     
	            02  IN-LL          PICTURE S9(3) COMP.                         
	            02  IN-ZZ          PICTURE S9(3) COMP.                         
	            02  IN-TRCD        PICTURE X(5).                               
	            02  IN-DATA1       PICTURE X(6).
	            02  IN-DATA2       PICTURE X(6).
							  
	        01  OUTPUT-MSG.                                                   
	            02  OUT-ALLSEGS  PICTURE X(99) VALUE SPACES.
	
	        01  OUTPUT-SEG1.
	            02  OUT-LL       PICTURE S9(3) COMP VALUE +0.                 
	            02  OUT-ZZ       PICTURE S9(3) COMP VALUE +0.                  
	            02  OUT-DATA1    PICTURE X(12) VALUE SPACES.
	
	        01  OUTPUT-SEG2.
	            02  OUT-LL       PICTURE S9(3) COMP VALUE +0.                 
	            02  OUT-ZZ       PICTURE S9(3) COMP VALUE +0.                  
	            02  OUT-DATA1    PICTURE X(13) VALUE SPACES.
	            02  OUT-DATA2    PICTURE X(14) VALUE SPACES.
	
	        01  OUTPUT-SEG3.
	            02  OUT-LL       PICTURE S9(3) COMP VALUE +0.                  
	            02  OUT-ZZ       PICTURE S9(3) COMP VALUE +0.                  
	            02  OUT-DATA1    PICTURE X(15) VALUE SPACES.
	            02  OUT-DATA2    PICTURE X(16) VALUE SPACES.
	            02  OUT-DATA3    PICTURE X(17) VALUE SPACES.   
С помощью мастера J2C вы можете создать объект EJB J2C, запускающий транзакцию IMS, следующим образом:
  • Создайте буферный класс сообщений для хранения выходного сообщения, возвращенного приложением IMS
  • Импортируйте файл COBOL для выполнения отображения из COBOL в Java как для входных, так и для выходных сообщений
    • Создайте операцию привязки ввода путем выбора структуры входных сообщений (представленную INPUT-MSG - структурой COBOL 01)
    • Создайте операции привязки вывода для сегментов выходного сообщения с помощью мастера отображения данных; для его запуска выберите Файл > Создать > Прочие > Привязка данных Java CICS/IMS. С помощью мастера привязки данных выберите для каждого сегмента правильный сегмент в качестве структуры данных и укажите параметры: кодовую страницу, имя endian, имя quote и имя trunc.
  • Вызов метода EJB J2C, запускающего транзакцию IMS, и заполнение выходных сегментов из буфера данных, возвращенных транзакцией IMS
package sample.ims;

import com.ibm.etools.marshall.util.MarshallIntegerUtils;
import sample.ims.data.*;

public class TestMultiSeg
{
	public static void main (String[] args)
	{
		byte[] segBytes = null;
		int srcPos = 0;
		int dstPos = 0;
		int totalLen = 0;
		int remainLen = 0;
		byte[] buff;
		short LL = 0;
		short ZZ = 0;

		try {
			// ---------------------------------------------------			
			// Входящее сообщение транзакции IMS заполняется
 // данными. Поле LL входящего сообщения задается с
 // помощью метода getSize() обработчика формата
 // входящего сообщения.
			// ---------------------------------------------------					
			InputMsg input = new InputMsg();
			input.setIn__ll((short) input.getSize());
			input.setIn__zz((short) 0);
			//----------------------------------------------
			// за кодом транзакции обратитесь к вашему 
			// администратору IMS
			//-----------------------------------------------
			input.setIn__trcd("SKS6 ");
			input.setIn__data1("M2 SI1");
			input.setIn__data2("M3 SI1");

			// ---------------------------------------------------			
			// Запустите транзакцию IMS.  Будет возвращено многосегментное 
			// выходное сообщение.
			// ---------------------------------------------------				
			MSOImpl proxy = new MSOImpl();
			
			sample.ims.CCIBuffer output = proxy.runMultiSegOutput(input);

			// ---------------------------------------------------	
			// Извлечение многосегментного выходного сообщения
   // в качестве массива байтов с помощью метода
   // getBytes() обработчика формата выходного
   // сообщения.
			// ---------------------------------------------------			 			
			System.out.println(
				"\nSize of output message is: " + output.getSize());
			segBytes = output.getBytes();

			srcPos = 0;
			dstPos = 0;
			totalLen = segBytes.length;
			remainLen = totalLen;

			// ---------------------------------------------------	
			// Заполнение первого сегмента объекта из буфера. 
			// ---------------------------------------			             
			buff = null;
			// Получение длины сегмента.
			LL =
				MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
					segBytes,
					srcPos,
					true,
					MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);

			// Поместить сегмент в байтовый массив.
			buff = new byte[LL];
			System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
			remainLen -= LL;

			// Создание и заполнение объекта сегмента из массива байтов.
			OutputSeg1 S1 = new OutputSeg1();
			S1.setBytes(buff);
			System.out.println(
				"\nOutSeg1 LL is:    "
					+ S1.getOut__ll()
					+ "\nOutSeg1 ZZ is:    "
					+ S1.getOut__zz()
					+ "\nOutSeg1_DATA1 is: "
					+ S1.getOut__data1());

			// ---------------------------------------------------	
			// Заполнение второго сегмента объекта из буфера. 
			// ---------------------------------------------------	
			srcPos += LL;
			buff = null;
			// Получение длины сегмента.
			LL =
				MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
					segBytes,
					srcPos,
					true,
					MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);

			// Поместить сегмент в байтовый массив.
			buff = new byte[LL];
			System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
			remainLen -= LL;

			// Создание и заполнение объекта сегмента из массива байтов.
			
			OutputSeg2 S2 = new OutputSeg2();
			S2.setBytes(buff);
			System.out.println(
				"\nOutSeg2 LL is:    "
					+ S2.getOut__ll()
					+ "\nOutSeg2 ZZ is:    "
					+ S2.getOut__zz()
					+ "\nOutSeg2_DATA1 is: "
					+ S2.getOut__data1()
					+ "\nOutSeg2_DATA2 is: "
					+ S2.getOut__data2());
			// ---------------------------------------------------				
			// Заполнение третьего сегмента объекта из буфера. 
			// ---------------------------------------------------	
			srcPos += LL;
			buff = null;
			// Получение длины сегмента.
			LL =
				MarshallIntegerUtils.unmarshallTwoByteIntegerFromBuffer(
					segBytes,
					srcPos,
					true,
					MarshallIntegerUtils.SIGN_CODING_TWOS_COMPLEMENT);

			// Поместить сегмент в байтовый массив.
			buff = new byte[LL];
			System.arraycopy(segBytes, srcPos, buff, dstPos, LL);
			remainLen -= LL;

			// Создание и заполнение объекта сегмента из массива байтов.
			OutputSeg3 S3 = new OutputSeg3();
			S3.setBytes(buff);
			System.out.println(
				"\nOutSeg3 LL is:    "
					+ S3.getOut__ll()
					+ "\nOutSeg3 ZZ is:    "
					+ S3.getOut__zz()
					+ "\nOutSeg3_DATA1 is: "
					+ S3.getOut__data1()
					+ "\nOutSeg3_DATA2 is: "
					+ S3.getOut__data2()
					+ "\nOutSeg3_DATA3 is: "
					+ S3.getOut__data3());
		}
		catch (Exception e)
		{
			System.out.println("\nCaught exception is: " + e);
		}
	}
}
Информация о сообщениях с разной длиной, многосегментных сообщениях и сообщениях, которые содержат массивы, находится в учебнике и примерах IMS, приведенных в интерактивной справке или справочной системе в средах разработки WebSphere или Rational.
  • Учебники IMS находятся в пункте Учебники > Действия и учебные материалы.
  • Примеры IMS находятся в пунктах Примеры > Примеры технологий > Примеры J2C.
Эти учебники и примеры содержат инструкции и примеры кодов для обработки особых форматов сообщений.

Комментарии