2016-08-15 4 views
5

Я работаю над программой Wrapper/Bridge COBOL, которая обрабатывает вызовы программ и выполняет сквозные операции, такие как ведение журнала, проверка безопасности и т. Д. Основная мотивация проверяется доступ к безопасности для потребительской программы, имеет ли он доступ к вызову программы-производителя или нет.Как передать данные раздела связи в раздел привязки другой программы в COBOL

Пусть программа COBOL моста будет B1 и программа-производитель P1 и потребитель (клиент) C1.

Когда C1 хочет позвонить P1, он должен позвонить в B1. Затем B1 проверяет доступность. Если C1 имеет доступ, то B1 вызывает P1 с данными C1.

C1 -> B1 -> P1 

Здесь раздел сцепления B1 и P1 одинаковый. Программы используют EXEC CICS LINK для вызова друг друга.

COMMAREA,

COMMAREA1 (DataSet Name) 

01 COMMAREA-STRUCT, 
    03 a-field 
    03 another-field  
    ... 

Клиент;

IDENTIFICATION DIVISION. 
PROGRAM-ID. Client. 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 

/* fill CommareaStruct with some values. */ 
.... 
/* call B1 Bridge */ 
    EXEC CICS LINK PROGRAM (B1Bridge)  NOHANDLE 
    COMMAREA (COMMAREA-STRUCT) 
    LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC 
.... 

Мост,

IDENTIFICATION DIVISION. 
PROGRAM-ID. B1Bridge. 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
LINKAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 
... 
/* access control */ 
/* logging */ 
... 
/* pass data to P1*/ 
    EXEC CICS LINK PROGRAM (P1)  NOHANDLE 
     COMMAREA (COMMAREA-STRUCT) 
     LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC 
.... 

Производитель;

IDENTIFICATION DIVISION. 
PROGRAM-ID. P1 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
LINKAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 
.... 

*doing some business with data in COMMAREA1 
... 

Когда я попытаюсь выше, я получил предупреждение о компиляции для программы Bridge B1; «COMMAREA-STRUCT» или один из его подчиненных был указан, но COMMAREA-STRUCT был элементом LINKAGE SECTION, который не имел адресности. Эта ссылка не будет разрешена успешно при выполнении ».

Что это значит? Как мне передать раздел связи B1 в раздел связей P1?

Когда я пытаюсь сделать это, я получил EIBRESP: 22 и EIBRESP2: 26 (ошибка длины сообщения) во время выполнения.

- Edit -

Я думаю, что я должен дать более подробную информацию;

Основная мотивация; На самом деле есть две компании, которые работают в компании COM1 и COM2. COM2 был аффилированным лицом COM1 в течение нескольких лет. COM1 и COM2 имеют соответственно CICS1 и CICS2. И клиентские программы COM2 используют программы-производители COM1. Клиенты COM2 никогда не называют производителей COM1 напрямую. Клиенты COM2 помещают данные в COMMAREA-STRUCT и вызывают универсальную программу Cobol (пусть это будет GCP) удаленно. COMMAREA-STRUCT имеет также поле «имя производителя», которое GCP определяет, какую программу нужно вызывать. Таким образом, GCP экспортирует данные из COMMAREA-STRUCT и карты в поля производителя. GCP выполняет операции отображения динамически с адресацией (не для каждого производителя). После выполнения производителем GCP берет результат и передает его клиенту через COMMAREA-STRUCT. Система была разработана так же, как и несколько лет назад. Есть тысячи клиентов COM2 и тысячи производителей COM1.

enter image description here

Теперь, COM2 хочет, кроме COM1. Таким образом, COM1 больше не хочет предоставлять полный доступ ко всем ресурсам (производителям) COM1. Таким образом, COM1 хочет поставить новые циклы перед CICS1, который будет обработчиком CICS, который запускает только программу B1 Bridge локально.Это также касается безопасности сети и решений компании-политики.

enter image description here Чтобы отделить компании друг от друга через некоторое время, ни клиенты, ни производители не должны быть затронуты. Таким образом, проблема должна быть решена в слое GCP-Bridge.

Именно поэтому мост B1 должен вести себя как GCP для клиентов COM2, должен проверять доступность (как-то, мы его применили) и передавать все данные, поступающие от клиентов на GCP, без каких-либо изменений.

В настоящее время операция регистрации не имеет приоритета. Мы немного сосредоточимся на компаниях.

Так что я очень благодарен за ваши комментарии экспертов.

* Мы не можем использовать CALL, потому что B1 будет находиться на другой CICS и не сможет получить доступ к LOADLIB1 COM1, поэтому B1 должен использовать GCP удаленно с помощью EXEC CICS LINK.

* Вместо того, чтобы проходить через запятую, прохождение канала звучит хорошо для меня. Мы поговорим об этом.

* Кстати, я проверю конфликт полслово-полуслова на LENGHT OF. Ты прав.

* Для проверки безопасности мы обсудим «ЗАВЕРШЕНИЕ СЕКЦИИ EXEC CICS QUERY».

* Как уже упоминалось выше, мы не можем изменять копии книг. Только мы можем изменить есть

EXEC CICS LINK PROGRAM (GCP) 

в

EXEC CICS LINK PROGRAM (B1) 

на клиентов, найти & заменить. Потому что тысячи клиентов. Мы не хотим менять книгу и прикасаться к ним.

В свете этих деталей, я думаю, проблема становится более понятной.

+0

Итак, посмотрите на свой выходной список из компиляции. Посмотрите на заголовок PROCEDURE DIVISION. См. ИСПОЛЬЗОВАНИЕ? Вот почему ваш 01 не имеет адресности, поскольку @cschneid подробно описал. Как программа клиента «входит в систему», и почему это не дает вам контроля доступа и регистрации? –

+0

Регистрация и безопасность могут быть интересными. 'EXEC CICS QUERY SECURITY' может быть целесообразным для обеспечения безопасности (обратитесь к вашим специалистам по безопасности). Ведение журнала - где? VSAM? DB2? Что вы регистрируете? – cschneid

+0

Спасибо за ваши комментарии экспертов. Я редактировал вопрос, который состоит из деталей проблемы и моих ответов. – Tunceren

ответ

7

В программе CICS COBOL, вызванной через EXEC CICS LINK, Секция связи должна содержать структуру уровня 01 с именем DFHCOMMAREA. Прекомпилятор или сопроцессор CICS компилятора COICS генерируют соответствующий USING для Отдела процедур, чтобы программа имела адресность к структуре DFHCOMMAREA.

DFHCOMMAREA будет содержать содержимое того, что вы звоните COMMAREA-STRUCT, когда вы LINK в целевую программу.

Один из способов решения проблемы, в которой вы обнаруживаете, - это изменить свою копию, чтобы удалить имя структуры уровня 01 и потребовать от всех клиентов для кодирования собственного имени структуры уровня 01 непосредственно перед оператором COPY. В мостах и ​​программах продюсеров это имя структуры уровня 01 будет DFHCOMMAREA.

Другой способ справиться с этой ситуацией - отказаться от LINK в пользу динамического CALL. Вы должны включить DFHEIBLK в качестве первого параметра CALL.

Еще один способ справиться с этой ситуацией - обходить сообщение для одного или нескольких контейнеров CICS.Вместо того, чтобы передавать сообщение на LINK, вы передадите канал, канал будет иметь один или несколько контейнеров, висящих на нем, содержащие данные, которые вы хотите передать.

Что-то, остерегайтесь, вы используете специальный реестр LENGTH OF для вашей запятой. Специальный регистр является полнословом, но параметр длины для запятой является полусловом. Я подозреваю, что это вызовет горе, если только IBM не создаст код для перехвата этой конкретной идиомы и переместит специальный регистр во временное полуслое (маловероятное, но возможно).

Update:

С вашей дополнительной информацией, очевидно, ваша задача состоит в том, чтобы написать «замену» для существующей программы (ГКП).

Прагматичным подходом может стать создание новой тетради, назовем ее COMAREA2, которая является копией COMAREA1, но без встроенного имени структуры уровня 01. Поместите заявление COPY COMAREA2 сразу после названия структуры DFHCOMMAREA 01 в программе B1.

Это не идеальный вариант, поскольку в документации где-то должно быть ясно, что изменения в копировальной машине COMAREA1 должны отражаться в COMAREA2. Разумеется, такой ручной процесс, как это, приводит к ошибке, но он действительно помогает вам модифицировать любую из программ C1 или P1.

Более элегантный, при условии, что он работает для вас, было бы попробовать ...

COPY COMAREA1 REPLACING == 01 COMMAREA-STRUCT== BY ==*01 COMMAREA-STRUCT==. 

... в вашем B1 программе. Это устранило бы необходимость в предлагаемой выше тетради COMAREA2. Если это работает, вы просто разместите оператор COPY после имени уровня структуры DFHCOMMAREA2 01.

+2

Предварительно/сопроцессор будет обрабатывать «длину» правильно. Кроме того, если LENGTH не указан, длина по умолчанию - это длина поля COMMAREA в любом случае. Элемент, указанный в LENGTH, не используется напрямую, а соответствующим образом массируется до полуслова. –

+0

@BillWoodger У меня есть тусклое воспоминание о том, что у меня возникли трудности с этим, поэтому я упомянул об этом. Видимо, это было давно, или мое воспоминание действительно тускло. – cschneid

+0

Существует вопрос, когда вы используете элемент данных, чтобы содержать длину, вы делаете его COMP (или COMP-4 или BINARY), а затем задаетесь вопросом, почему он был усечен при настройке (он должен быть COMP-5), но проблема связана с настройкой поля, а не с его передачей. –