Back-End

23 ago, 2011

Use Java em regiões dependentes de IMS

Publicidade

Este artigo ajuda administradores de IMS, programadores de sistema e programadores de aplicativos que estão interessados em usar Java® dentro de regiões dependentes de IMS. Este artigo destaca e fornece exemplos das etapas necessárias para implementar Java em regiões dependentes de IMS, incluindo regiões com Java Batch Processing (JBP), Java Message Processing (JMP) e Message Processing Program (MPP). O exemplo de MPP mostra o recurso de interoperar entre COBOL e Java.

Introdução

Este artigo descreve uma abordagem para usar Java dentro
de regiões dependentes de IMS. Exemplos mostram como configurar,
executar e solucionar problemas do seguinte:

  • Aplicativos IMS Java em regiões Java Batch Processing (JBP)
  • Regiões Java Message Processing (JMP)
  • Interoperação entre COBOL e Java dentro de Message Processing Programs (MPP)

O suporte para Java em regiões dependentes de IMS foi
fornecido por requisitos entregues usando o fluxo de serviço IMS V10 e
V11 e com APARs (PM02734) (PK86498) tipo 2 e JVM APARs.
Além disso, o seguinte é necessário:

  • LE APAR PK99010
  • driver DB2® para JDBC
  • PTF UK52962
  • JDK Versão 6.0

As seções JBP, JMP e MPP deste artigo são autônomas.
Algumas informações são repetidas em cada uma das áreas, mas isso é
intencional para permitir que cada seção seja lida de
maneira independente das outras. Funções específicas, incluindo
programador e administrador de sistema, que estejam associadas às
atividades serão indicadas com Função:
para diferentes áreas do artigo, quando adequado.

Entendendo drivers IMS Universal e Java

O IMS oferece diversas soluções para desenvolver e
estender aplicativos em ambientes de cliente usando Java. Como parte das
versões 10 e 11 do IMS, o IMS fornece drivers IMS Universal que incluem
suporte para driver Java para conectividade tipo 2 dentro de regiões
dependentes de IMS. Esse suporte possibilita que os clientes desenvolvam
novos aplicativos em Java usando o driver IMS Universal JDBC e o driver
IMS Universal DL/I.

Os drivers IMS Universal são componentes de software que
fornecem aos aplicativos Java conectividade e acesso a bancos de dados
IMS a partir do z/OS®
e ambientes distribuídos através de TCP/IP. Os aplicativos Java que usam
drivers IMS Universal tipo 2 devem residir na mesma partição lógica
(LPAR) que o subsistema IMS. Aplicativos Java que usam os drivers IMS
Universal tipo 4 podem residir na mesma partição lógica (LPAR) ou em uma
LPAR diferente dos subsistemas IMS.

O driver JDBC

IMS fornece um driver Java Database Connectivity (JDBC)
para conectividade de banco de dados com base em SQL para acessar bancos
de dados IMS sobre TCP/IP com o driver IMS Universal JDBC que está
incluso nos drivers IMS Universal. O driver IMS Universal JDBC é baseado
no padrão JDBC 3.0. O JDBC é uma interface de programação de
aplicativos (API) que aplicativos Java usam para acessar bancos de dados
relacionais ou origines de dados tabulares.

A API do JDBC é o padrão do setor para conectividade
dependente de banco de dados entre a linguagem de programação Java e
qualquer banco de dados implementado na interface JDBC. O cliente usa a
interface para consultar e atualizar dados em um banco de dados. è
responsabilidade do driver JDBC em si implementar o protocolo de acesso
subjacente (específico) para o banco de dados específico para o qual o
driver está implementado.

Os drivers são adaptadores do lado do cliente, assim, são
instalados na máquina do cliente, não no servidor. Os drivers
convertem solicitações de programas Java para um protocolo que o sistema
de gerenciamento de banco de dados (DBMS) pode entender. O suporte IMS
para JDBC permite que aplicativos Java emitam chamadas SQL dinâmicas
para acessar dados do IMS e processar o conjunto de resultados que é
retornado em um formato tabular.

O driver IMS Universal JDBC é projetado para suportar um
subconjunto de sintaxe SQL com funcionalidade limitada ao que o sistema
de gerenciamento de banco de dados IMS pode processar nativamente. Seu
design centrado em DBMS possibilita que o driver IMS Universal JDBC
aproveite totalmente os recursos de alto desempenho do IMS. O driver IMS
Universal JDBC também fornece suporte de função agregada, suporte ORDER
BY e suporte GROUP BY.

Conectividade de arquitetura tipo 2 do driver JDBC

Programas Java com conectividade JDBC tipo 2 podem
executar no mesmo sistema z/OS ou partição local (LPAR) zSeries® que o
subsistema IMS de destino. O driver IMS Universal JDBC com conectividade
tipo 2 é usado para acessar o IMS a partir de regiões dependentes de
Java (JDRs), incluindo regiões JMP e JBP. Ao programar, a propriedade
driverType deve ser definida para indicar conectividade local (tipo 2)
para IMS.

Conectividade de arquitetura tipo 4 do driver IMS Universal JDBC

O driver IMS Universal JDBC com conectividade tipo 4 é
usado para acessar o subsistema IMS através de conexão de rede TCP/IP.
Com conectividade tipo 4, os drivers IMS Universal fornecem suporte para
a Secure Sockets Layer (SSL) através da Java Secure Socket Extension
(JSSE).

Driver IMS Universal DL/I

O driver IMS Universal DL/I é usado quando há necessidade
de escrever consultas granulares para acessar bancos de dados IMS
diretamente a partir de um cliente Java em um ambiente não gerenciado.
Em função das diferenças fundamentais entre bancos de dados hierárquicos
e bancos de dados relacionais, às vezes o driver IMS Universal JDBC não
fornece acesso ao conjunto completo de recursos de banco de dados IMS.

O driver IMS Universal DL/I está fortemente relacionado à
interface de chamada tradicional IMS DL/I usada com outras linguagens
de programação para escrever aplicativos em IMS. O driver fornece um
acesso de nível inferior às funções do banco de dados IMS que a API
JDBC. O driver IMS Universal DL/I fornece a habilidade de construir
segment search arguments (SSAs) e usar os métodos do objeto program
communication block (PCB) para ler, inserir, atualizar, excluir ou
realizar operações em lote em segmentos. Controle total de navegação na
hierarquia do segmento é obtido usando o driver IMS Universal DL/I.

Entendendo regiões dependentes de IMS e JAVA

O IMS fornece espaços de endereço para executar programas
de aplicativos e sistema que usam serviços IMS. Esses espaços de
endereço são chamados de regiões dependentes. . As regiões
dependentes são iniciadas pelo envio do JCL para o sistema operacional. O
JCL é enviado através de um comando emitido para a região de controle
de IMS, através de automação, ou através de um envio de tarefa em lote
regular. Depois de as regiões dependentes serem iniciadas, os programas
de aplicativos são programados e enviados pela região de controle do
IMS. Em todos os casos, o espaço de endereço z/OS executa um programa
de região de controle IMS. O programa de aplicativo então é carregado e
chamado pelo código IMS. Até 999 regiões dependentes podem ser
conectadas a uma região de controle IMS.

Regiões dependentes podem ser regiões orientadas por
mensagem (processamento de mensagens) ou regiões não orientadas por
mensagens (lote). As message processing regions (MPRs) executam
aplicativos que processam mensagens que vem para o IMS TM como entrada,
como de terminais ou programas online. O IMS enviando o JCL como
resultado de um comando IMS pode iniciar MPRs. O espaço de endereço não
carrega automaticamente programas de aplicativos, mas espera até que a
tarefa fique disponível. Configurações prioritárias determinam qual MPR
executa o programa de aplicativo. Quando o IMS determina que um
aplicativo deve executar em um MPR em particular, o programa de
aplicativo é carregado nessa região e recebe controle. O aplicativo
processa a mensagem e qualquer outra mensagem para a transação que
esteja aguardando processamento. Então, dependendo das opções
especificadas na definição da transação, o aplicativo espera mais
entradas ou outro programa de aplicativo é carregado para processar uma
transação diferente.

O IMS fornece os seguintes tipos de região dependente:

  • Regiões de processamento de mensagens, que leem e processam mensagens da fila de mensagens do IMS, incluindo o seguinte:
    • Message Processing Program (MPP)
    • IMS Fast Path (IFP)
    • Java Message Processing (JMP)
  • Regiões não orientadas por mensagem, que são orientadas por lote e não processam mensagens IMS:
    • Batch Message Processing (BMP)
    • Java Batch Processing (JBP)

Regiões JMP e regiões JBP possibilitam que Java, COBOL
orientado a objeto, PL/I orientado a objeto ou uma combinação dessas
linguagens obtenha controle quando uma transação IMS é programada. Isso
difere de regiões IFP e regiões BMP, que permitem que programas escritos
em Assembler. PL/I, C, COBOL e PASCAL obtenham controle quando uma
transação IMS é programada.

Regiões dependentes de IMS suportam Java Virtual Machines
(JVM) persistentes para fornecer a habilidade de fazer chamadas de
maneira eficiente que interoperam com Java e linguagens como COBOL e
PL/I. Isso permite a capacidade de aproveitar aplicativos IMS
existentes, bem como funcionalidade estendida usando Java. A
interoperabilidade é suportada em regiões MPP, BMP, IFP, JMP e JBP.

Usar Java para desenvolver nova lógica de negócios
permite aproveitar as habilidades que são comuns no ambiente do mundo
distribuído, como JDBC.
Além disso, é possível reduzir o custo de executar aplicativos Java
aproveitando mecanismos System z Application Assist Processor (zAAP),
que auxiliam na redução do uso de MIPs debitáveis ao processar Java.

Regiões JBP executam programas flexíveis que realizam
processamento tipo lote online e podem acessar as filas de mensagem IMS
para saída (similar a aplicativos BMP não orientados por mensagem).
Aplicativos JBP são iniciados enviando uma tarefa com JCL ou para TSO.
Aplicativos JBP são como aplicativos BMP, exceto que não podem ler
mensagens de entrada da fila de mensagens IMS. Como aplicativos BMP, os
aplicativos JBP podem usar ponto de verificação simbólico e reiniciar
chamadas para reiniciar o aplicativo após um encerramento anormal.
Aplicativos JBP podem acessar dados IMS ou DB2 em um ambiente DB/DC ou
DBCTL e dados DB2 em um ambiente DCCTL.

Ambiente JBP: Configuração

Esta seção descreve o uso de Java em um ambiente de região de Java Batch Processing.

Função: Programador de sistema

Esta seção fornece uma visão geral para configurar uma
região IMS Java Batch Processing (JBP) para executar aplicativos Java. A
Listagem 1 fornece um exemplo de uma tarefa chamada JBPSAMPL para
iniciar uma região JBP.

Listagem 1. Tarefa de amostra JBPSAMPL para iniciar uma região JBP

//JBPSAMPL  JOB,0M 
// CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=32M
//       EXEC DFSJBP,                                                
//            IMSID=IMSB,MBR=JBPSAMPL,PSB=S2U1LPSJ,JVMOPMAS=DFSJVMMS,
//            ENVIRON=DFSJVMEV
//STEPLIB  DD DSN=IMS.PGMLIB,DISP=SHR           
//         DD DSN=IMS.SDFSJLIB,DISP=SHR
//         DD DSN=IMS.SDFSRESL,DISP=SHR
//         DD DSN=CEE.SCEERUN,DISP=SHR                           
//         DD DSN=SYS1.CSSLIB,DISP=SHR                           
//PROCLIB  DD DSN=IMS.PROCLIB,DISP=SHR
//JAVAOUT  DD  PATH='/tmp/jvm.out',                              
//             PATHDISP=(KEEP,KEEP),                                
//             PATHOPTS=(OWRONLY,OCREAT,OTRUNC),                    
//             PATHMODE=(SIRWXU,SIRWXG,SIRWXO)                                          
//JAVAERR  DD  PATH='/tmp/jvm.err',
//             PATHDISP=(KEEP,KEEP),                                
//             PATHOPTS=(OWRONLY,OCREAT,OTRUNC),                    
//             PATHMODE=(SIRWXU,SIRWXG,SIRWXO)    

A tarefa JBPSAMPL executa o procedimento DFSJBP fornecido no padrão IMS.PROCLIB. Os parâmetros incluem o seguinte:

IMSID
O ID do subsistema IMS sob o qual executar
MBR
Um nome de programa de aplicativo
PSB
O bloco de especificações do programa definido no
IMS para permitir acesso adequado ao banco de dados e transações com
base na definição do PSB. Na amostra de JBPSAMPL, S2U1LPSJ é o PSB
fornecido. O PSB de amostra chamado S2U1LPSJ é mostrado na Listagem 2.

Listagem 2. Definição de PSB S2U1LPSJ

PCB   TYPE=DB,DBDNAME=S2U1ADBD,PROCOPT=A,KEYLEN=20,           X
               PCBNAME=PCB01                                            
         SENSEG  NAME=ADDINFO,PARENT=0                                  
         PSBGEN  LANG=JAVA,PSBNAME=S2U1LPSJ                             
         END 

O S2U1LPSJ fornece acesso ao segmento ADDINFO no banco de
dados S2U1ADBD definido no IMS. Além disso, a opção de processamento
(PROCOPT) especifica A, que permite todas as operações com relação a um segmento, incluindo recuperar, atualizar, inserir e excluir.

Recomendação

Se estiver usando PCBs que definam múltiplos segmentos, o
PROCOPT P é recomendado para permitir unir segmentos na mesma
hierarquia. Isso é útil quando os aplicativos exigem dados de múltiplos
segmentos em uma única consulta.

Importante: Se estiver usando o driver IMS
Universal, um PCBNAME ou LABEL é necessário na instrução PCB, pois
bibliotecas Java aproveitam as interfaces AIB, que exigem que o nome ou o
rótulo esteja presente. JVMOPAS é o nome do membro IMS.PROCLIB que
contém CLASSPATH e as opções JVM para o BVM mestre. A Listagem 3 mostra
um exemplo de membro DFSJVMMS de JVMOPAS IMS.PROCLIB.

Listagem 3. Membro DFSJVMMS

********************************************************************  
* Specify the profile that has environment settings and JVM options.  
* The following two JVM options are required.                                  
********************************************************************            
-Djava.class.path=>                                                             
/stjava/ims/IMS Universal driver .jar:>  
/stjava/ims/imsutm.jar:>                                                        
/stjava/SolutionTestApps.jar:>                                                  
********************************************************************            
* The following JVM options are a subset of the options allowed
* Xmx64M       - set the maximum Java heap size of your program     
* Xmso512k     - set stack size for OS threads for 32 bit  
* Xss256k      - set Java thread stack size                                
* Xms1M        - set initial Java heap size                       
*******************************************************************          
-Xmaxf0.8
-Xminf0.3
-Xmx64M  
-Xmso512k
-Xss256k 
-Xms1M   

CLASSPATH (java.class.path) na Listagem 3 especifica o
local do driver IMS Universal .jar, imsutm.jar, e bibliotecas
SolutionTestApps.jar. Os drivers IMS Universal .jar e imsutm.jar são as
bibliotecas necessárias ao programar com as APIs do driver IMS
Universal. Os drivers IMS Universal .jar e imsutm.jar podem ser
instalados usando o IMS Installation
Verification Program (IVP) para cenários Java.

Os drivers IMS Universal driver .jar e imsutm.jar são as
bibliotecas necessárias aos programas com as APIs do driver IMS
Universal. A instalação do SMP/E do IMS Java On Demand FMID adiciona as
partes do adaptador de recurso IMS Universal DB nos diretórios adequados
no sistema de arquivos. Antes de o IMS Java On Demand FMID poder ser
instalado, um sistema de arquivos ZFS ou HFS deve ser criado e montado.
Quando esse sistema de arquivos tiver sido montado, uma tarefa de
amostra DFSJSMKD é executada para criar os diretórios no sistema de
arquivos. DFSJSMKD chama DFSJMKDR para criar as estruturas de diretório e
o link simbólico libT2DLI.so.

SolutionTestApps.jar contém os aplicativos de amostra
para serem executados nessa amostra. A Listagem 4 mostra uma lista dos
conteúdos do arquivo SolutionTestApps.jar.

Listagem 4. Conteúdos do arquivo SolutionTestApps.jar

JavaPayPolicy.class
databaseviews/S2U1LPSJDatabaseView.class
databaseviews/S2U1PSBDatabaseView.class
com/ibm/ims/st/opendb/jmp/AdditionalCustomerIOMessage.class
com/ibm/ims/st/opendb/jmp/AdditionalCustomerCRUD.class  
com/ibm/ims/st/opendb/jbp/AdditionalCustomerInfo.class  

ENVIRON é o nome do membro IMS.PROCLIB que contém a
definição do caminho da biblioteca (LIBPATH) para o ambiente Java. A
Listagem 5 mostra o ENVIRON IMS.PROCLIB, membro DFSJVMEV.

Listagem 5. Membro de amostra DFSJVMEV

**********************************************************************
* Specify the location of Java Virtual Machine (JVM) installation and 
* IMS Java native code (libT2DLI.so) 
**********************************************************************
LIBPATH=>     
/javaroot/java160/J6.0/bin:>     
/javaroot/java160/J6.0/bin/j9vm:>     
/usr/lpp/ims/lib 

Os dois primeiros caminhos especificados no ponto
DFSJVMEV para as bibliotecas de tempo de execução Java Versão 6.0
localizadas no z/OS UNIX® System Services (USS)
Hierarchical File System (HFS). O último caminho
especifica o local de libT2DLI.so, que aponta para o código nativo para
conectividade Java tipo 2 IMS fornecida no IMS Versões 10 e 11. O
arquivo libT2DLI.so é criado no sistema de arquivos USS ao executar o
Programa de Verificação de Instalação IMS para cenários Java.

MBR é um nome de programa de aplicativo usado para chamar aplicativos Java.

Para indicar qual aplicativo Java chamar ao executar JBP,
especifica um nome de 1-8 caracteres no parâmetro MBR. Quando o nome
MBR é especificado, o JBP tenta carregar o membro DFSJVMAP IMS.PROCLIB.
DFSJVMAP mapeia nomes MBR para nomes de classe Java totalmente
qualificados.

A Listagem 6 mostra um exemplo de uma definição DFSJVMAP.

Listagem 6. Membro de amostra DFSJVMAP

**********************************************************************
* The Java applications specified here are located in the      
* SolutionTestApps.jar file.        
********************************************************************** 
JBPSAMPL=com/ibm/ims/st/opendb/jbp/AdditionalCustomerInfo
********************************************************************** 

Neste exemplo, JBPSAMPL é mapeado para uma classe Java
chamada AdditionalCustomerInfo, de modo que quando o JBP é enviado, ele
executará o método principal na classe Java AdditionalCustomerInfo Java.
Se o parâmetro MBR não for fornecido, o JBP tenta carregar uma classe
Java com o nome de PSB. Para o exemplo, o IMS tentará carregar
S2U1LPSJ.class.

A tarefa JBPSAMPL na Listagem 1,
também especifica os nomes DD JAVAOUT e JAVAERR. Esses arquivos são
usados para aplicativos Java, e especificam onde os fluxos Java
System.out e System.err são gravados. As instruções DD JAVAOUT e JAVAERR
DD fornecidas criam esses arquivos se eles não existem, e se eles já
existem, serão substituídos.

Ambiente JBP: Desenvolvimento de aplicativo

Esta seção descreve o desenvolvimento do aplicativo JBP.

Função: DBA ou programador de aplicativos, dependendo do seu ambiente

Quando você planeja acessar um banco de dados IMS a partir
de Java, a primeira etapa no desenvolvimento de aplicativos que usam o
driver IMS Universal é criar uma visualização do banco de dados.
Essa visualização do banco de dados é uma classe Java contendo metadados
que descrevem IMS PSBs, DBDs, segmentos, campos, relacionamentos,
chaves/não chaves e informações de tipo de dado. Essa classe serve como o
metadado para um PSB e seu conjunto de visualizações relacionadas
(PCBs) e bancos de dados (DBDs). Isso é necessário para os drivers IMS
Universal construírem e validarem consultas com relação a bancos de
dados IMS, bem como layouts de campo em um segmento.

Para gerar essa classe de metadados, o IMS fornece um Plug-in do Utilitário IMS Enterprise Suite
DLIModel para Eclipse, que pode ser transferido por download sem custos (consulte Recursos).

O plug-in é instalado sobre o Eclipse e fornece um
assistente, que importa origem PSB e origem DBD para gerar a
visualização do banco de dados com base em um PSB em particular. No JCL
fornecido na Listagem 1, ,
o PSB usado é S2U1LPSJ, que faz referência a um DBD chamado S2U1ADBD. A
origem para S2U1LPSJ e S2U1ADBD precisa ser transferida por download
com um nome de arquivo que corresponde aos nomes do PSB e DBD.

Sugestão: É possível para um DBD fazer
referência a outros DBDs, então se certifique de fazer o download de
todos os DBDs referidos, incluindo DBDs indexados secundários, DBDs
lógicos e DBDs referidos em instruções LCHILD. Entre em contato com o
administrador de banco de dados (DBA) para se certificar de que isso
está disponível para uso.

Quando obtiver todas as partes, procure as informações do
plug-in do utilitário MS Enterprise Suite DLIModel no InfoCenter
(consulte Recursos).

Para sua referência, a Listagem 7 mostra o
S2U1LPSJDatabaseView.java gerado usando o utilitário DLIModel. Nunca
será necessário olhar para esta classe, pois as bibliotecas Java a
consomem internamente. Na classe S2U1LPSJDatabaseView, o segmento
ADDINFO contém informações do cliente adicionais e possui vários campos
definidos, incluindo CustomerNumber (Chave Única), E-mail, Fone, Fax, e
assim por diante.

Listagem 7. S2U1LPSJDatabaseView.java

package databaseviews;

import com.ibm.ims.db.*;
import com.ibm.ims.base.*;

public class S2U1LPSJDatabaseView extends DLIDatabaseView {

    // This class describes the data view of PSB: S2U1LPSJ
    // PSB S2U1LPSJ has database PCBs with 8-char PCBNAME or label: 
    //       PCB01

    // The following describes Segment: ADDINFO ("ADDINFO") in PCB: PCB01 ("PCB01")
    static DLITypeInfo[] PCB01ADDINFOArray= {
        new DLITypeInfo("info_length", DLITypeInfo.SMALLINT, 1, 2),
        new DLITypeInfo("CustomerNumber", DLITypeInfo.INTEGER, 3, 4,
     		"CUSTNO",DLITypeInfo.UNIQUE_KEY),
        new DLITypeInfo("Email", DLITypeInfo.CHAR, 7, 30),
        new DLITypeInfo("Phone", DLITypeInfo.CHAR, 37, 10),
        new DLITypeInfo("Fax", DLITypeInfo.CHAR, 47, 10),
        new DLITypeInfo("CompanyName", DLITypeInfo.CHAR, 57, 30),
        new DLITypeInfo("DriversLicense", DLITypeInfo.CHAR, 87, 8),
        new DLITypeInfo("DLState", DLITypeInfo.CHAR, 95, 2),
        new DLITypeInfo("Notes", DLITypeInfo.CHAR, 97, 1468)
    };
    static DLISegment PCB01ADDINFOSegment= new DLISegment
        ("ADDINFO","ADDINFO",PCB01ADDINFOArray,1564);

    // An array of DLISegmentInfo objects follows to describe the view 
	// for PCB: PCB01 ("PCB01")
    static DLISegmentInfo[] PCB01array = {
        new DLISegmentInfo(PCB01ADDINFOSegment,DLIDatabaseView.ROOT)
    };

    // Constructor
    public S2U1LPSJDatabaseView() {
        super("2.0.3","S2U1LPSJ", "PCB01", "PCB01", PCB01array, "A");
    } // end S2U1LPSJDatabaseView constructor

} // end S2U1LPSJDatabaseView class definition

Acessando o banco de dados IMS em Java usando o driver IMS Universal JDBC ou o driver IMS Universal DL/I

Os drivers IMS Universal fornecem duas APIs: JDBC e DL/I
para Java. O driver IMS Universal JDBC trata segmentos IMS DB como
equivalentes às tabelas relacionais. As Listagens 8 e 9 apresentam
amostras de aplicativo fornecidas para cada. As amostras serão
executadas em uma região JBP e relatarão uma lista de todos os números
de cliente, nomes de empresa e números telefônicos no segmento ADDINFO
(tabela). 

Listagem 8. Driver IMS Universal JDBC para a API Java

public static void main(String[] args) {
	//Setting Type 2 Properties
	IMSDataSource imsDS = new IMSDataSource();
	imsDS.setDatastoreName("IMSB");
	imsDS.setDriverType(IMSDataSource.DRIVER_TYPE_2);
	imsDS.setMetadataURL("class://databaseviews.S2U1LPSJDatabaseView");
	
	//Application is used to get a Transaction object
	Application app = ApplicationFactory.createApplication();
	
	//Transaction is primarily used for commit or rollback calls
	Transaction tran = app.getTransaction();
		
	try {
		Connection conn = imsDS.getConnection();
		Statement st = conn.createStatement();
		ResultSet rs = st.executeQuery(
		  "SELECT CustomerNumber, CompanyName, Phone FROM PCB01.ADDINFO");
		
		while(rs.next()){
		   System.out.println("CustomerNumber: " + 
		      rs.getString("CustomerNumber") + 
			  ", CompanyName: " + 
			  rs.getString("CompanyName") + 
			  ", Phone: " + 
			  rs.getString("Phone"));
		}
		
		rs.close();
		st.close();
		tran.commit();
		conn.close();
	} catch (SQLException e) {
		System.out.println("An SQLException occurred: " + e.getMessage());
		e.printStackTrace();
	} catch (DLIException e) {
		System.out.println("A DLIException occurred: " + e.getMessage());
		e.printStackTrace();
	}
}

JDBC é uma API padrão para emitir instruções SQL em Java. O aplicativo usa IMSDataSource para definir o seguinte:

  • Tipo do driver
  • Nome do armazenamento de dados ou IMSID
  • A URL de metadados aponta para o driver IMS Universal para a classe de visualização do banco de dados para o PSB sendo acessado

O aplicativo usa o modelo de programação JDBC padrão para
obter uma conexão, criar uma instrução, executar a instrução e
processar o conjunto de resultados. Para confirmar os dados em regiões
dependentes de IMS, use a instância de transação (tran) para confirmar o
trabalho feito.

A Listagem 9 apresenta um exemplo que usa o driver IMS Universal DL/I.

Listagem 9. Exemplo de driver IMS Universal DL/I

public static void main(String[] args) {
	//Setting Type 2 Properties
	IMSConnectionSpec connSpec = IMSConnectionSpecFactory.createIMSConnectionSpec();
	connSpec.setDatastoreName("IMSB");
	connSpec.setDriverType(IMSConnectionSpec.DRIVER_TYPE_2);
	connSpec.setMetadataURL("class://databaseviews.S2U1LPSJDatabaseView");
	
	//Application is used to get a Transaction object
	Application app = ApplicationFactory.createApplication();
	
	//Transaction is primarily used for commit or rollback calls
	Transaction tran = app.getTransaction();
	
	try {
            PSB psb = PSBFactory.createPSB(connSpec);
            PCB pcb = psb.getPCB("PCB01");
            SSAList ssa = pcb.getSSAList("ADDINFO");
            PathSet pathSet = pcb.batchRetrieve(ssa);
		
	    while(pathSet.hasNext()){
	        Path path = pathSet.next();
	        System.out.println("CustomerNumber: " + 
			   path.getString("CustomerNumber") + 
	           ", CompanyName: " + 
			   path.getString("CompanyName") + 
	           ", Phone: " + 
			   path.getString("Phone"));
	    }	
	
            tran.commit();
            psb.close();
	} catch (DLIException e) {
		System.out.println("An error occurred: " + e.getMessage());
		e.printStackTrace();
	}

O método principal na Listagem 9 mostra como obter uma
conexão do tipo 2 para S2U1LPSJ criando IMSConnectionSpec que especifica
o seguinte:

  • Tipo do driver
  • Nome do armazenamento de dados ou IMSID
  • A URL de metadados aponta para o driver IMS Universal para a classe de visualização do banco de dados para o PSB sendo acessado

A seguir, o aplicativo usa os objetos PSB, PCB e SSAList
para executar uma recuperação em lote do segmento ADDINFO. Isso retorna
um pathSet, que é uma coleção de caminhos. Um objeto de caminho é a área
de E/S para a chamada do banco de dados e contém os segmentos que a
chamada retorna. Um loop while é usado para imprimir uma linha para cada
caminho retornado listando os campos Número do cliente, Nome da empresa
e Número do telefone.

Ambiente JBP: Implementando o aplicativo Java

Esta seção descreve como implementar o aplicativo Java no ambiente JBP.

Função: Desenvolvedor de aplicativos e Administrador do sistema

Para implementar o aplicativo, exporte o projeto Java como um arquivo jar e coloque o arquivo jar em FTP para seu sistema de arquivo USS no modo BINARY no LPAR em que deseja executar.

O arquivo jar deve ser referido no membro DFSJVMMS IMS.PROCLIB descrito na Listagem 3. Na listagem 3, stjava, é o diretório no qual o archive do aplicativo SolutionTestApps.jar foi colocado no FTP.

Executando o JBP e visualizando os resultados

Esta seção descreve como executar o JBP e visualizar os resultados.

Função: Desenvolvedor de aplicativos

Agora que todas as partes estão no lugar (JCL, membros IMS.PROCLIB e classes Java), execute JBPSAMPL JCL na Listagem 1. .
Para verificar os resultados, use SDSF para localizar a tarefa JBP
ativa ou concluída. Certifique-se de que não há erros no JOBLOG para a
tarefa JBPSAMPL.

A seguir, verifique os locais de saída especificados por
JAVAOUT e JAVAERR. Na amostra, é possível localizar JAVAOUT em
/tmp/jvm.out, e localizar JAVAERR em /tmp/jvm.err no ambiente USS. Se
nada tiver sido escrito para o fluxo de erro, jvm.err está vazio. Para o
aplicativo de amostra, o arquivo jvm.out contém um relatório de números
de cliente, nomes de empresa e números do telefone.

Na maioria dos sistemas z/OS, é possível acessar o ambiente USS inserindo OMVS
a partir de TSO. Para procurar um arquivo no ambiente
USS que tenha o nome jvm.out e que esteja localizado no caminho tmp,
insira obrowse /tmp/jvm.out.

Ambiente JMP: Configuração

Esta seção descreve o uso do Java em um ambiente de região de processamento em lote de Java.

Função: Programador de sistema

Um programa de aplicativo JMP é similar a um programa de
aplicativo MPP, exceto que aplicativos JMP são escritos em Java ou COBOL
orientado a objetos. Como um aplicativo MPP, um aplicativo JMP é
iniciado quando há uma mensagem na fila de mensagens para o aplicativo
JMP. O IMS programa a mensagem para processamento.

Cada código de transação representa uma transação que o
aplicativo JMP processa. Um único aplicativo também pode ser iniciado a
partir de múltiplos códigos de transação. Aplicativos JMP são muito
flexíveis em como processam transações e onde enviam a saída.
Aplicativos JMP enviam quaisquer mensagens de saída para as filas de
mensagem e processam a próxima mensagem com o mesmo código de transação.
O programa continua a executar até que não haja mais mensagens com o
mesmo código de transação.

Os aplicativos JMP podem acessar dados IMS ou DB2 z/OS em
um ambiente DB/DC, e podem acessar dados DB2 z/OS em um ambiente DCCTL
usando JDBC. Os aplicativos JMP executam em regiões JMP que possuem Java
virtual machines (JVMs). Aplicativos JMP também podem fazer o seguinte:

  • Recuperar mensagens de entrada da fila de mensagens do IMS
  • Acessar IMS e DB2 para bancos de dados z/OS
  • Confirmar ou retroceder transações
  • Enviar mensagens de saída

Esta seção descreve a configuração específica para executar um JMP que use o driver tipo 2 do driver IMS Universal.

A Listagem 10 é um exemplo de uma função que inicia uma região JMP.

Listagem 10. JMP com driver tipo 2 do driver IMS
Universal

//JMPADTL1 JOB ,                                              
// CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=0M 
/*JOBPARM  S=*                                                
//       EXEC DFSJMP,                                         
//            IMSID=IMSB,JVMOPMAS=DFSJVMMS,ENVIRON=DFSJVMEV,  
//            CL1=002,CL2=000,CL3=000,CL4=000                 
//STEPLIB  DD DSN=IMS.PGMLIB,DISP=SHR           
//         DD DSN=IMS.SDFSJLIB,DISP=SHR
//         DD DSN=IMS.SDFSRESL,DISP=SHR
//         DD DSN=CEE.SCEERUN,DISP=SHR                           
//         DD DSN=SYS1.CSSLIB,DISP=SHR                           
//PROCLIB  DD DSN=IMS.PROCLIB,DISP=SHR
//JAVAOUT  DD  PATH='/tmp/jvm.out',                              
//             PATHDISP=(KEEP,KEEP),                                
//             PATHOPTS=(OWRONLY,OCREAT,OTRUNC),                    
//             PATHMODE=(SIRWXU,SIRWXG,SIRWXO)                                          
//JAVAERR  DD  PATH='/tmp/jvm.err',
//             PATHDISP=(KEEP,KEEP),                                
//             PATHOPTS=(OWRONLY,OCREAT,OTRUNC),                    
//             PATHMODE=(SIRWXU,SIRWXG,SIRWXO

A tarefa JMPADTL1 executa o procedimento DFSJMP fornecido no IMS.PROCLIB padrão. Os parâmetros incluem o seguinte:

IMSID
O ID do subsistema IMS sob o qual executar
JVMOPAS
O nome do membro IMS.PROCLIB que contém as opções CLASSPATH e JVM
para o JVM mestre. Nesta amostra, o membro DFSJVMMS é definido na
Listagem 11.

Listagem 11. Membro de amostra DFSJVMMS

********************************************************************  
* Specify the profile that has environment settings and JVM options.  
* The following two JVM options are required.                                  
********************************************************************            
-Djava.class.path=>                                                             
/stjava/ims/IMS Universal driver .jar:>        
/stjava/ims/imsutm.jar:>                                                        
/stjava/SolutionTestApps.jar:>        
********************************************************************            
* The following JVM options are a subset of the options allowed
*                                                                       
* Xmx64M       - set the maximum Java heap size of your program    
* Xmso512k     - set stack size for OS threads for 32 bit   
* Xss256k      - set Java thread stack size      
* Xms1M        - set initial Java heap size      
********************************************************************  
-Xmaxf0.8
-Xminf0.3
-Xmx64M  
-Xmso512k
-Xss256k 
-Xms1M   

O CLASSPATH (java.class.path) especifica o driver IMS
Universal .jar, imsutm.jar e as bibliotecas SolutionTestApps.jar. Os
drivers IMS Universal
.jar e imsutm.jar são as bibliotecas necessárias ao
programar com as APIs do driver IMS Universal. A instalação SMP/E do IMS
Java On Demand FMID adiciona as partes necessárias aos diretórios
apropriados no sistema de arquivos. Antes de instalar o IMS Java On
Demand FMID, é necessário criar e montar um ZFS ou um sistema de
arquivos HFS.Uma vez que esse sistema de arquivos estiver montado, é
possível executar a tarefa de amostra DFSJSMKD para criar os diretórios
no sistema de arquivo. DFSJSMKD chama DFSJMKDR para criar as estruturas
do diretório e o link simbólico libT2DLI.so.

A SolutionTestApps.jar contém os aplicativos de amostra a
serem executados neste artigo. A Listagem 12 mostra os conteúdos do
arquivo SolutionTestApps.jar gerados usando o comando jar tf SolutionTestApps.jar
.

Listagem 12. Arquivo SolutionTestApps.jar

JavaPayPolicy.class
databaseviews/S2U1LPSJDatabaseView.class
databaseviews/S2U1PSBDatabaseView.class
com/ibm/ims/st/opendb/jmp/AdditionalCustomerIOMessage.class
com/ibm/ims/st/opendb/jmp/AdditionalCustomerCRUD.class  
com/ibm/ims/st/opendb/jbp/AdditionalCustomerInfo.class 

O parâmetro ENVIRON especifica o nome do membro
IMS.PROCLIB que contém a definição do caminho da biblioteca (LIBPATH)
para o ambiente Java. Na amostra, DFSJVMEV é definido como mostrado na
Listagem 13.

Listagem 13. Membro de amostra DFSJVMEV

**********************************************************************
* Specify the location of Java Virtual Machine (JVM) installation and 
* IMS Java native code (libT2DLI.so) 
**********************************************************************
LIBPATH=>                                                             
/javaroot/java160/J6.0/bin:>                                          
/javaroot/java160/J6.0/bin/j9vm:>                                     
/usr/lpp/ims/lib 

Os primeiros dois caminhos especificados em DFSJVMEV
apontam para as bibliotecas de tempo de execução Java Versão 6.0
localizadas no sistema de arquivos z/OS UNIX System Services (USS).
. O último caminho especifica o local do libT2DLI.so, que aponta para o
código nativo Java para conectividade Java tipo 2 IMS fornecida no IMS
Versões 10 e 11. O arquivo libT2DLI.so é criado no sistema de arquivos
USS ao executar o programa de instalação IMS para os cenários Java.

Parâmetros CL1,CL2,CL3 e CL4 são parâmetros posicionais
que especificam quatro números decimais de três dígitos indicando quais
classes de mensagens devem ser processadas por essa região de mensagem. O
valor máximo para uma classe é 999. A sequência de especificação das
classes determina a prioridade de classe relativa dentro da região da
mensagem.

O JMPADTL1 na Listagem 10
também especifica os nomes DD JAVAOUT e JAVAERR. Esses arquivos são
usados para aplicativos Java e especificam onde os fluxos Java
System.out e System.err são escritos. As instruções DD JAVAOUT e JAVAERR
criarão esses arquivos se um deles não existir, e se existir, serão
substituídos.

Para indicar qual aplicativo Java chamada quando uma
transação for programada, o IMS usa o membro DFSJVMAP IMS.PROCLIB. Cada
transação no IMS tem um nome de aplicativo associado. Para o propósito
deste artigo, a transação que será usada é ADTLTRAN.

Há duas maneiras de definir transações no IMS: Etapa 1 definições ou
dynamic resource definitions (DRD). Use o seguinte comando de consulta
DRD na Listagem 14 para obter o nome PSB para a trans.

Listagem 14. Comando de consulta DRD

QRY TRAN NAME(ADTLTRAN) SHOW(PSB CLASS)

A Listagem 15 mostra a saída do comando DRD.

Listagem 15. Saída do comando DRD

Trancode MbrName    CC PSBname  LCls 
ADTLTRAN IMSB        0 S2U1LPSJ    2

A saída de comando DRD mostra o nome do PSB e a classe de
mensagem para a transação ADTLTRAN. Se o sistema IMS não estiver usando
a funcionalidade DRD, é possível encontrar essas definições nas
definições da Etapa1 (MODBLKS). Neste caso, o número de classe indicado
(2) corresponde ao parâmetro CL1=002 em JMPADTL1 da Listagem 10.
O nome do PSB é S2U1LPSJ. O IMS procura o membro DFSJVMAP IMS.PROCLIB
para esse nome para determinar a classe Java correta para chamar. A
Listagem 16 mostra um exemplo de DFSJVMAP, que mapeia S2U1LPSJ para a
classe Java AdditionalCustomerCRUD.

Listagem 16. Membro de amostra DFSJVMAP

**********************************************************************
* The Java applications specified here are located in the             
* SolutionTestApps.jar file.                                          
********************************************************************** 
S2U1LPSJ=com/ibm/ims/st/opendb/jmp/AdditionalCustomerCRUD 
**********************************************************************

Ambiente JMP: Desenvolvimento de aplicativo

Esta seção descreve o desenvolvimento do aplicativo JMP

Função: DBA ou programador de aplicativos, dependendo do seu ambiente

Para este exemplo de JMP, quando ADTLTRAN é chamado, o
aplicativo Java executado é AdditionalCustomerCRUD. O aplicativo insere
informações do cliente no segmento ADTLINFO do banco de dados S2U1ADBD
IMS. O PSB sendo usado é definido na Listagem 16.

As etapas para criar o aplicativo JMP incluem as seguintes:

  1. Criar uma classe Java para representar os layouts de mensagens de entrada/saída
  2. Criar uma visualização do banco de dados Java para representar o layout do banco de dados
  3. Criar o aplicativo contendo a lógica de negócios para processar as mensagens de entrada/saída e interagir com o banco de dados

Criar classes de mensagem de entrada/saída Java

Para este exemplo, o aplicativo espera uma mensagem de
entrada contendo todos os campos necessários para inserir no segmento
ADTLINFO, incluindo os seguintes:

  • Número de cliente exclusivo
  • Endereço de e-mail
  • Número do telefone
  • Número do fax
  • Nome da empresa
  • Carteira de habilitação
  • Estado
  • Notas adicionais

Este exemplo também usa o mesmo formato de mensagem
para a mensagem de saída. Também incluirá um campo de mensagem de erro
para indicar sucesso ou falha.

As bibliotecas do driver IMS Universal fornecem uma
classe abstrata chamada IMSFieldMessage para objetos Java que
representam uma mensagem tanto chegando quanto saindo de uma fila de
mensagens IMS. O código Java na Listagem 17 mostra a definição de
mensagem de entrada/saída pra o aplicativo.

Listagem 17. Mensagem de entrada/saída Java

public class AdditionalCustomerIOMessage extends IMSFieldMessage {
	private static final long serialVersionUID = 23432884;
	
    static DLITypeInfo[] fieldInfo = {
    	new DLITypeInfo("CustomerNumber", DLITypeInfo.INTEGER, 1, 4, "CUSTNO"),
        new DLITypeInfo("Email", DLITypeInfo.CHAR, 5, 30),
        new DLITypeInfo("Phone", DLITypeInfo.CHAR, 35, 10),
        new DLITypeInfo("Fax", DLITypeInfo.CHAR, 45, 10),
        new DLITypeInfo("CompanyName", DLITypeInfo.CHAR, 55, 30),
        new DLITypeInfo("DriversLicense", DLITypeInfo.CHAR, 85, 8),
        new DLITypeInfo("DLState", DLITypeInfo.CHAR, 93, 2),
        new DLITypeInfo("Notes", DLITypeInfo.CHAR, 95, 1468),
        new DLITypeInfo("ErrorMessage", DLITypeInfo.CHAR, 1563, 500)
    };
    /**
     * Instantiate a new OutMessage object. 
	 **/
    public AdditionalCustomerIOMessage() {     
    	 super(fieldInfo, 2070, false); //false indicates that this is not a SPA message
                                        //2070 is the length of the message
    }
}

Criando uma visualização de banco de dados Java

Ao acessar o banco de dados IMS de Java usando os drivers
IMS Universal, é preciso gerar uma visualização de banco de dados. Essa
visualização do banco de dados é uma classe Java com metadados
descrevendo IMS PSBs, DBDs, segmentos, campos, relacionamentos,
chaves/não chaves e informações de tipo de dados. Isso é necessário para
os drivers IMS Universal construírem e validarem consultas com relação a
bancos de dados IMS. A visualização do banco de dados gerada deve ser
compilada no mesmo nível em que a JVM usado no IMS está ativa.

Para gerar essa classe de metadados, o IMS fornece um
Plug-in do Utilitário IMS Enterprise Suite DLIModel para Eclipse, que
pode ser transferido por download sem custos (consulte Recursos).

O plug-in é instalado sobre o Eclipse e fornece um
assistente, que importa origem PSB e origem DBD para gerar a
visualização do banco de dados com base em um PSB em particular. No JCL
fornecido na Listagem 10,
o PSB usado é S2U1LPSJ, que faz referência a DBD S2U1ADBD.
A origem para S2U1LPSJ e S2U1ADBD precisa ser
transferida por download com um nome de arquivo que corresponda ao nome
de PSB e DBD.

Sugestão: É possível um DBD fazer referência a
outros DBDs, assim, certifique-se de fazer o download de todos os DBDs
referidos, incluindo DBDs indexados secundários, DBDs lógicos e DBDs
referidos nas instruções LCHILD. Entre em contato com o administrador do
banco de dados (DBA) para certificar-se de que estão disponíveis para
uso.

Quando obtiver todas as partes, siga o tutorial do
Capítulo 6.3 Utilitário IBM IMS Enterprise Suite DLIModel para o IMS
Versão 11 Visão Geral Técnica (consulte Recursos ).

A Listagem 18 mostra uma visualização de S2U1LPSJDatabaseView.java.

Listagem 18. S2U1LPSJDatabaseView.java

package databaseviews;

import com.ibm.ims.db.*;
import com.ibm.ims.base.*;

public class S2U1LPSJDatabaseView extends DLIDatabaseView {

    // This class describes the data view of PSB: S2U1LPSJ
    // PSB S2U1LPSJ has database PCBs with 8-char PCBNAME or label: 
    //       PCB01

    // The following describes Segment: ADDINFO ("ADDINFO") in PCB: PCB01 ("PCB01")
    static DLITypeInfo[] PCB01ADDINFOArray= {
        new DLITypeInfo("info_length", DLITypeInfo.SMALLINT, 1, 2),
        new DLITypeInfo("CustomerNumber", DLITypeInfo.INTEGER, 3, 4, 
		               "CUSTNO",DLITypeInfo.UNIQUE_KEY),
        new DLITypeInfo("Email", DLITypeInfo.CHAR, 7, 30),
        new DLITypeInfo("Phone", DLITypeInfo.CHAR, 37, 10),
        new DLITypeInfo("Fax", DLITypeInfo.CHAR, 47, 10),
        new DLITypeInfo("CompanyName", DLITypeInfo.CHAR, 57, 30),
        new DLITypeInfo("DriversLicense", DLITypeInfo.CHAR, 87, 8),
        new DLITypeInfo("DLState", DLITypeInfo.CHAR, 95, 2),
        new DLITypeInfo("Notes", DLITypeInfo.CHAR, 97, 1468)
    };
    static DLISegment PCB01ADDINFOSegment= new DLISegment
        ("ADDINFO","ADDINFO",PCB01ADDINFOArray,1564);

    // An array of DLISegmentInfo objects follows to describe the view 
	// for PCB: PCB01 ("PCB01")
    static DLISegmentInfo[] PCB01array = {
        new DLISegmentInfo(PCB01ADDINFOSegment,DLIDatabaseView.ROOT)
    };

    // Constructor
    public S2U1LPSJDatabaseView() {
        super("2.0.3","S2U1LPSJ", "PCB01", "PCB01", PCB01array, "A");
    } // end S2U1LPSJDatabaseView constructor

} // end S2U1LPSJDatabaseView class definition

O aplicativo Java de amostra

O aplicativo de amostra AdditionalCustomerCRUD usa o
driver IMS Universal para obter acesso às filas de mensagem do IMS e o
JDBC para acessar o banco de dados IMS. A Listagem 19 detalha as
principais partes do aplicativo de amostra AdditionalCustomerCRUD.

Listagem 19. Aplicativo AdditionalCustomerCRUD

public static void main(String[] args) {
	Application app = ApplicationFactory.createApplication();
	Transaction tran = app.getTransaction();
	MessageQueue msgQueue = app.getMessageQueue();
	IOMessage ioMessage = null;
		
	try {
		ioMessage = app.getIOMessage
	  ("class://com.ibm.ims.solutiontest.opendb.jmp.AdditionalCustomerIOMessage");
		while (msgQueue.getUnique(ioMessage)) {
			IMSDataSource ds = new IMSDataSource();			
			ds.setMetadataURL("class://databaseviews.S2U1LPSJDatabaseView");
			ds.setDatastoreName("IMSB");
			ds.setDriverType(IMSDataSource.DRIVER_TYPE_2);
				
			Connection conn = ds.getConnection();
			conn.setAutoCommit(false);
	 			
			PreparedStatement addinfo = conn.prepareStatement("INSERT INTO "
			+ "PCB01.ADDINFO (Info_length,CustomerNumber,Email,"
			+  Phone, Fax, CompanyName,"
			+ "DriversLicense, DLState, Notes) Values(?,?,?,?,?,?,?,?,?)");

			addinfo.setInt(1, 1564);
			addinfo.setInt(2, ioMessage.getInt("CustomerNumber"));
			addinfo.setString(3, ioMessage.getString("email"));
			addinfo.setString(4, ioMessage.getString("Phone"));
			addinfo.setString(5, ioMessage.getString("Fax"));
			addinfo.setString(6, ioMessage.getString("CompanyName"));
			addinfo.setString(7, ioMessage.getString("DriversLicense"));
			addinfo.setString(8, ioMessage.getString("DLState"));
			addinfo.setString(9, ioMessage.getString("Notes"));
		
			int rowsInserted = addinfo.executeUpdate();
		
			if (rowsInserted == 1) {
				ioMessage.setString("ErrorMessage", "");
			} else {
				ioMessage.setString("ErrorMessage", "Insert failed");
			}
		
			addinfo.close();
			conn.close();
				
			msgQueue.insert(ioMessage, MessageQueue.DEFAULT_DESTINATION);
			tran.commit();
			}
		} catch (Exception e) {
			e.printStackTrace();
		try {
		if(e.getMessage().length()>500){
		ioMessage.setString("ErrorMessage", e.getMessage().substring(0, 500));
		} else {
		ioMessage.setString("ErrorMessage", e.getMessage());
		}	
		msgQueue.insert(ioMessage, MessageQueue.DEFAULT_DESTINATION);	
		} catch (DLIException e1) {
		e1.printStackTrace();			
		}
	}
}

A primeira parte do aplicativo cria as seguintes instâncias para permitir interação com a fila de mensagens:

  • Application
  • Transaction
  • MessageQueue
  • IOMessage

As seguintes listagens de código mostram uma instância de
aplicativo (app) sendo criada usando ApplicationFactory. O objeto app é
usado para obter um controle sobre uma instância de transaction,
messageQueue e ioMessage. Ao criar uma instância de ioMessage, um
parâmetro de sequência é usado para especificar o nome totalmente
qualificado da classe Java criada para representar a mensagem. A
Listagem 20 é um extrato da Listagem 19.

Listagem 20. Mensagem de entrada/saída da classe Java

Application app = ApplicationFactory.createApplication();
Transaction tran = app.getTransaction();
MessageQueue msgQueue = app.getMessageQueue();
IOMessage ioMessage = app.getIOMessage
+ ("class://com.ibm.ims.solutiontest.opendb.jmp.AdditionalCustomerIOMessage");

A seguir, o aplicativo usa a instância MessageQueue
(msgQueue) para recuperar mensagens da fila de mensagens IMS usando a
chamada de método getUnique. O método getUnique toma um parâmetro,
ioMessage, que define a estrutura da mensagem da mensagem de entrada
esperada descrita na Listagem 17. .
Se a chamada getUnique é bem-sucedida, ioMessage é preenchida com os
dados da mensagem de entrada de transaction. A Listagem 21 mostra a
chamada getUnique.

Listagem 21. Chamada getUnique

while (msgQueue.getUnique(ioMessage))

Quando a mensagem é recuperada, o aplicativo cria
IMSDataSource para obter uma conexão de tipo 2 para S2U1LPSJ PSB. Para
especificar o PSB para o aplicativo ao qual se conectar, forneça o nome
de classe totalmente qualificado da visualização de banco de dados
criada na Listagem 18. . Então use a instância IMSDataSource (ds) para obter uma conexão JDBC, como mostrado na Listagem 22.

Listagem 22. Obtendo uma conexão JDBC

IMSDataSource ds = new IMSDataSource();
ds.setMetadataURL("class://databaseviews.S2U1LPSJDatabaseView");
ds.setDatastoreName("IMSB");
ds.setDriverType(IMSDataSource.DRIVER_TYPE_2);
				
Connection conn = ds.getConnection();

Ao usar JDBC de dentro de uma transação do IMS, a conexão
JDBC setAutoCommit deve ser definida para falso para evitar que
conexões JDBC automaticamente confirmem trabalho. Confirmações são, em
vez disso, emitidas explicitamente usando o objeto transaction ou
implicitamente confirmadas quando o método getUnique retorna um código
de status de QC do IMS indicando que não há mais mensagens na fila, como
mostrado na Listagem 23.

Listagem 23. setAutoCommit

conn.setAutoCommit(false);

A seguir, o aplicativo cria PreparedStatement (addinfo)
para definir a chamada de inserção SQL, como mostrado na Listagem 24.
Essa chamada SQL será inserida no segmento ADDINFO definido em S2U1LPSJ
PSB, e fornecerá os dados de entrada, incluindo o seguinte:

  • Info_length
  • CustomerNumber
  • E-mail
  • Fone
  • Fax
  • CompanyName
  • Habilitação
  • DLState
  • Notas

Listagem 24. Fornecendo dados de entrada

PreparedStatement addinfo = conn.prepareStatement("INSERT INTO "
	+ "PCB01.ADDINFO (Info_length,CustomerNumber,Email, Phone, Fax, CompanyName,"
	+ "DriversLicense, DLState, Notes) Values(?,?,?,?,?,?,?,?,?)");

O aplicativo então usa ioMessage para obter os dados da
mensagem de entrada. O aplicativo usa os dados para definir campos
addinfo para inserir no segmento ADTLINFO, como mostrado na Listagem 21.
Os valores 1-9 nos métodos addinfo.set listados na Listagem 25
correspondem a cada um dos nove pontos de interrogação (?) (?)
especificados em PreparedStatement.

Listagem 25. Configurando dados

addinfo.setInt(1, 1564);
	addinfo.setInt(2, ioMessage.getInt("CustomerNumber"));
	addinfo.setString(3, ioMessage.getString("email"));
	addinfo.setString(4, ioMessage.getString("Phone"));
	addinfo.setString(5, ioMessage.getString("Fax"));
	addinfo.setString(6, ioMessage.getString("CompanyName"));
	addinfo.setString(7, ioMessage.getString("DriversLicense"));
	addinfo.setString(8, ioMessage.getString("DLState"));
	addinfo.setString(9, ioMessage.getString("Notes"));

Depois que os valores da instrução preparados estão
definidos, o aplicativo executa a instrução usando o método
executeUpdate(), que retorna um número inteiro indicando o número de
linhas (segmentos) afetados pela chamada, como mostrado na Listagem 26.

Listagem 26. Número de linhas inseridas

int rowsInserted = addinfo.executeUpdate();

No caso desta inserção, o aplicativo verifica que uma
linha foi inserida no banco de dados. Se a operação foi bem-sucedida, o
aplicativo define o campo ErrorMessage da mensagem de saída como em
branco. Caso contrário, define o campo ErrorMessage d mensagem de saída
como Insert failed, como mostrado na Listagem 27.

Listagem 27. Falha na inserção

if (rowsInserted == 1) {
	ioMessage.setString("ErrorMessage", "");
} else {
	ioMessage.setString("ErrorMessage", "Insert failed");
}

O aplicativo então insere uma mensagem de saída para a
fila de mensagens do IMS usando DEFAULT_DESTINATION, como mostrado na
Listagem 28.
O aplicativo também pode escolher inserir mensagens para
destinos de mensagem alternativos. Depois da inserção, o aplicativo
confirma a unidade de trabalho.

Listagem 28. Inserir mensagem

msgQueue.insert(ioMessage, MessageQueue.DEFAULT_DESTINATION);
tran.commit();

Por fim, o aplicativo fecha as instâncias de conexão e a instrução preparada, como mostrado na Listagem 29.

Listagem 29. Fechar instrução preparada

addinfo.close();
conn.close();

Ambiente JMP: Implementando o aplicativo Java

Esta seção descreve como implementar o aplicativo Java.

Função: Desenvolvedor de aplicativos e Administrador do sistema

Depois de escrever o aplicativo, a próxima etapa é
implementá-lo. Para implementar o aplicativo, exporte o projeto Java
como um arquivo jar e coloque em FTP o arquivo jar para o seu sistema de
arquivos USS no modo BINARY no LPAR no qual deseja executar. O arquivo
jar deve ser referido no membro DFSJVMMS IMS.PROCLIB descrito na Listagem 11 para DFSJVMMS. No DFSJVMMS, stjava é o diretório para o qual o archive do aplicativo SolutionTestApps.jar
foi colocado em FTP.

Ambiente JMP: Executando a transação JMP

Esta seção descreve como executar a transação JMP

Função: Desenvolvedor de aplicativos

Agora que todas as partes estão no lugar (JCL, membros IMS.PROCLIB e classes Java), execute JMPADTL1 JCL a partir da Listagem 10.
Para verificar que a região JMP está executando, emita o comando /DISPLAY
ACTIVE REGION
do comando IMS e verifique se a saída é similar à da Listagem 30.

Listagem 30. /DISPLAY IACTIVE REGION

DFS000I     REGID JOBNAME   TYPE  TRAN/STEP PROGRAM  STATUS   CLASS   IMSB        
DFS000I         1 JMPADTL1  TPE                      WAITING  2       IMSB  

Agora a transação ADTLTRAN do IMS está pronta para a
execução. A próxima etapa é chamar o aplicativo. É possível chamar a
transação do IMS a partir de qualquer um dos seguintes:

  • Adaptador de recursos TM
  • Interface do cliente OTMA
  • Aplicativos MFS
  • API de conexão do IMS para C
  • API de conexão do IMS para Java
  • Console do MVS
  • Terminal do IMS

Depois de a transação ser chamada com sucesso, verifique
os locais de saída especificados por JAVAOUT e JAVAERR. Com base na
tarefa JMPADTL1, você encontrará JAVAOUT em /tmp/jvm.out, e é possível localizar JAVAERR em /tmp/jvm.err no ambiente USS. Caso nada tenha sido escrito para qualquer um dos fluxos, jvm.err e jvm.out estarão vazios.

Na maioria dos sistemas z/OS, é possível acessar o ambiente USS emitindo OMVS
a partir de TSO. Para procurar um arquivo chamado jvm.out no USS localizado no caminho tmp , emita o comando obrowse /tmp/jvm.out especificado.

O aplicativo fornece uma resposta de mensagem de saída que é retornada para o cliente.

Solução MPP: Visão geral

Esta seção descreve como usar uma região MPP para uma
solução COBOL para Java. Este cenário é uma transação de pagamento de
seguro que acessa um banco de dados IMS para determinar o valor devido
para uma apólice e também paga apólices atualizando o banco de dados com
informações de pagamento. Esse cenário de interoperabilidade
COBOL/Java inicia com um aplicativo IMS COBOL. Quando o aplicativo COBOL
é chamado, ele chama um programa wrapper OO COBOL, que chama um método
Java. O programa wrapper OO COBOL é essencialmente um programa que
converte a interface COBOL em uma interface Java. A meta para esse
cenário é estender um programa COBOL legado para chamar métodos Java
modernizados que podem acessar tanto bancos de dados IMS quanto bancos
de dados DB2.

No IMS 10 e IMS 11, o IMS fornece suporte para uma JVM
persistente nas regiões MPP/BMP/IFP/JMP/JBP. Também suporta chamadas do
DB2 de um aplicativo Java chamado por um MPP/BMP/IFP/JMP/JBP usando uma
External Subsystem Attach Facility (ESAF). Atualmente, cada vez que um
aplicativo Java é chamado, o COBOL cria e destrói a JVM. Esse novo
suporte possibilita que o IMS agora gerencie a JVM apenas uma vez e a
mantenha ao longo da vida da região.

Ambiente MPP: Configuração

Esta seção descreve a configuração do ambiente MPP.

Função: Programador de sistema

Para executar um aplicativo de interoperabilidade
COBOL/Java, é necessária alguma configuração. Esta seção descreve todas
as etapas necessárias para executar a solução COBOL para Java em uma
região MPP.

A Listagem 31 mostra uma tarefa de amostra para iniciar a região MPP.

Listagem 31. Tarefa de amostra para iniciar a região MPP

//IMSMPP01 JOB ,                                              
// CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=0M 
/*JOBPARM  S=*                                                
//PROCS JCCLIB ORDER=IMS.PROCLIB       
//IMSMPP01 EXEC PROC=DFSMPR,TIME=(1440),                     
//   NBA=6,
//   OBA-5;
//   SOUT=’*’   
//         CL1=001,               TRANSACTION CLASS 1          
//         CL2=000,               TRANSACTION CLASS 2          
//         CL3=000,               TRANSACTION CLASS 3          
//         CL4=000,               TRANSACTION CLASS 4          
//         TLIM=10,               MPR TERMINATION LIMIT        
//         SOD=,                  SPIN-OFF DUMP CLASS          
//         ENVIRON=DFSJVMEV,                                   
//         JVMOPMAS=DFSJVMMS,                                  
//         IMSID=IMSB,            IMSID OF IMS CONTROL REGION  
//         PREINIT=DC,            PROCLIB DFSINTXX MEMBER      
//         PWFI=N                 PSEUDO=WFI                   
//PROCLIB  DD DISP=SHR,DSN=IMS.PROCLIB      
//DFSCTL   DD DISP=SHR,DSN=IMS.PROCLIB(DFSSBPRM)     
//SYSEXEC  DD  DSN=IMS.SDFSEXEC,            
//             DISP=SHR                                         
//SYSTSIN  DD *                                                 
//SYSTSPRT DD SYSOUT=*                                          
//SYSOUT   DD SYSOUT=*             

A tarefa IMSMPP01 executa o procedimento DFSMPR fornecido no IMS.PROCLIB padrão. Os parâmetros incluem o seguinte:

IMSID
O ID do subsistema do IMS sob o qual executar
ENVIRON
O nome do membro IMS.PROCLIB que contém o caminho da biblioteca (LIBPATH) para o ambiente Java
JVMOPMAS
O nome do membro IMS.PROCLIB que contém as opções CLASSPATH e para a JVM mestre.
CL1, CL2, CL3, CL4
Um parâmetro posicional requerido que especifica números decimais de
três dígitos indicando quais classes de mensagem devem ser processadas
por esta região de mensagem. O valor máximo para uma classe é 999. A
sequência de especificação das classes determina a prioridade de classe
relativa dentro da região da mensagem.

A Listagem 32 define as configurações de ENVIRON

Listagem 32. Membro de amostra DFSJVMEV

**********************************************************************
* Specify the location of Java Virtual Machine (JVM) installation and 
* IMS Java native code (libT2DLI.so) 
**********************************************************************
LIBPATH=>                                                             
/javaroot/java160/J6.0/bin:>                                          
/javaroot/java160/J6.0/bin/j9vm:>                                     
/usr/lpp/ims/lib  

Os primeiros dois caminhos especificados em DFSJVMEV
apontam para as bibliotecas de tempo de execução Java Versão 6.0
localizadas no sistema de arquivos z/OS UNIX System Services (USS). O
terceiro caminho especifica o local de libT2DLI.so, que aponta para o
código nativo Java para conectividade Java tipo 2 do IMS fornecida no
IMS Versões 10 e 11. O arquivo libT2DLI.so é criado no sistema de
arquivos USS durante a execução do processo de instalação do IMS para
cenários Java. A Listagem 33 define as opções da JVM JVMOPMAS.

Listagem 33. Membro de amostra DFSJVMMS

********************************************************************  
* Specify the profile that has environment settings and JVM options.  
* The following two JVM options are required.                                  
********************************************************************            
-Djava.class.path=>                                                             
/stjava/ims/IMS Universal driver .jar:>    
/stjava/ims/imsutm.jar:>                                                        
/stjava/SolutionTestApps.jar:>                                                  
********************************************************************            
* The following JVM options are a subset of the options allowed
*                                                                               
* Xmx64M       - set the maximum Java heap size of your program      
* Xmso512k     - set stack size for OS threads for 32 bit     
* Xss256k      - set Java thread stack size    
* Xms1M        - set initial Java heap size      
********************************************************************  
-Xmaxf0.8
-Xminf0.3
-Xmx64M  
-Xmso512k
-Xss256k 
-Xms1M      

Esteja ciente dos seguintes detalhes:

  • O CLASSPATH (java.class.path) especifica as bibliotecas do IMS Universal .jar e imsutm.jar.
  • As .jar e imsutm.jar do driver IMS Universal são bibliotecas necessárias ao se programar com as APIs do driver IMS Universal.
  • As .jar e imsutm.jar do driver IMS Universal podem
    ser instadas usando o installation verification program (IVP) do IMS
    para cenários Java.
  • As .jar e imsutm.jar do driver IMS Universal são bibliotecas necessárias ao se programar com as APIs do driver IMS Universal.
  • A instalação SMP/E do IMS Java On Demand FMID adiciona as partes necessárias aos diretórios apropriados no sistema de arquivos.
  • Antes de o IMS Java On Demand FMID poder ser instalado, um sistema de arquivos ZFS ou HFS deve ser criado e montado.
  • Quando esse sistema de arquivos tiver sido montado, a
    tarefa de amostra FSJSMKD é executada para criar os diretórios no
    sistema de arquivos.
  • DFSJSMKD chama DFSJMKDR para criar as estruturas de diretório e o link simbólico libT2DLI.so.

Ambiente MPP: Desenvolvimento de aplicativo

Esta seção descreve o desenvolvimento do aplicativo MPP

Função: Desenvolvedor de aplicativos

Opções de compilação dll e encadeamento devem ser especificadas para o programa OO COBOL. O parágrafo Program-id do programa deve ser qualificado com a palavra-chave recursivo
para o programa OO COBOL chamar métodos Java. O código de amostra na
Listagem 34 implementa um programa OO COBOL (INQPAY.cbl) para o programa
Java (JavaPayPolicy.java) passando um tipo de dado primitivo e
retornando um tipo de dado primitivo de um banco de dados IMS.

Listagem 34. INQPAY.cbl

cbl dll,thread
       Identification division.
       Program-id. "INQPAY" recursive.
       Environment division.
       Configuration section.
       Repository.
           Class Base is "java.lang.Object"
           Class JavaException is "java.lang.Exception"
           Class jstring is "jstring"
           Class JavaPayPolicy is "JavaPayPolicy".
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 jpp object reference JavaPayPolicy.
       01 stringBuf pic X(500) usage display.
       01 ccDate object reference jstring.
       01 rc pic s9(9) comp-5
       01 CA-PAYMENT-CCEXP      PIC X(10).
       01 CA-PAYMENT-ID         PIC 9(10).
       01 PAYMENTID PIC S9(9) COMP.  
       01 AMOUNTDUE pic S9(6) comp-5.
       Linkage section.
       COPY STCMAREA.
       COPY JNI.
       01  IOPCB.
           02  LTERM-NAME   PICTURE X(8).
           02  FILLER       PICTURE X(2).
           02  TPSTATUS     PICTURE XX.
           02  FILLER       PICTURE X(3620).
       01  DBPCB.
           02  DBNAME       PICTURE X(8).
           02  SEG-LEVEL-NO PICTURE X(2).
           02  DBSTATUS     PICTURE XX.
           02  FILLER       PICTURE X(20).
       Procedure division USING IOPCB, COMM-AREA, DBPCB.
           Set address of JNIenv to JNIEnvPtr
           Set address of JNINativeInterface to JNIenv
           Move CA-PAYMENT-ID to PAYMENTID
           IF CA-REQUEST-ID EQUAL 'INQPAY  '
           THEN Invoke JavaPayPolicy "getAmountPaid" using by value
               PAYMENTID returning
               AMOUNTDUE
           Goback.
       End program
       "INQPAY".

O código de amostra na Listagem 35 implementa um programa
OO COBOL para programa Java passando um tipo de dado primitivo e
retornando um tipo de dado de sequência de um banco de dados do IMS.

Listagem 35. Fragmento do código INQPAY.cbl

       Invoke JavaPayPolicy "getCCDate" using by value
		PAYMENTID returning
		ccdate
       Call 'GetStringPlatform'
            using by value JNIEnvPtr
                 ccDate
                 address of stringbuf
                 500
                 0
               returning rc
               If rc not = zero then
                   Display "Error occurred creating CARDEXP object"
                   Stop run
               End-if
               MOVE stringBuf to CA-PAYMENT-CCEXP
           Goback.
       End program
       "INQPAY".

A Listagem 36 mostra os métodos getAmountPaid e getCCDate
que o programa OO COBOL chama que faz uma chamada IMS DB e retornar o
resultado para o programa OO COBOL de chamada. Para mais informações
sobre passar parâmetros entre programas OO COBOL e Java, tipos de dados
devem ser interoperáveis como descrito no Enterprise COBOL para z/OS
(consulte Recursos ).

Listagem 36. JavaPayPolicy.java

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.annotation.Resource;
import javax.annotation.Resource.AuthenticationType;
import javax.sql.DataSource;
import com.ibm.ims.dli.tm.ApplicationFactory;
import com.ibm.ims.dli.tm.Transaction;
import com.ibm.ims.dli.tm.Application;
import com.ibm.ims.jdbc.IMSDataSource;
import java.sql.DriverManager;
import java.util.logging.*;
//import test.PaymentInfo;

import com.ibm.ims.jdbc.IMSDataSource;

 public class JavaPayPolicy
 {		
	 static int amountDue=0;
	 static Application app = null;
	 private static Transaction tran = null;
	 final static Logger loggerDli = Logger.getLogger("com.ibm.ims.db.opendb.dli");
	 final static Logger loggerT2 = Logger.getLogger("com.ibm.ims.db.dli.t2");	
	 
	 	public static String getCCDate(int paymentID) {
		  try{
				
   		    IMSDataSource datasource = new IMSDataSource();
			datasource.setDriverType(IMSDataSource.DRIVER_TYPE_2);
			datasource.setDatastoreName("IMSB");
			datasource.setMetadataURL(
			  "class://databaseviews.S2U1PSBDatabaseView");
			Connection conn = datasource.getConnection();
			conn.setAutoCommit(false);
			// create a statement
			PreparedStatement stmt = conn.prepareStatement(
			  "Select creditCardExp from PGINSUR.Payment where PAYMENTID ="
					+ paymentID);
			while (rs.next()) {
				creditCardExp = rs.getString(1);
		   	}
			rs.close();
			stmt.close();
 			conn.close();
 			app = ApplicationFactory.createApplication();
			tran = app.getTransaction();	

			return creditCardExp;
	 	  }catch(SQLException e) {
	 		e.printStackTrace();
	 		return null;
	 	  }    	   
	 	}	    	    
		public static int getAmountPaid(int paymentID) {
   	      try{
			IMSDataSource datasource = new IMSDataSource();
			datasource.setDriverType(IMSDataSource.DRIVER_TYPE_2);
			datasource.setDatastoreName("IMSB");
			datasource.setMetadataURL(
			   "class://databaseviews.S2U1PSBDatabaseView");
			Connection conn = datasource.getConnection();
			conn.setAutoCommit(false);
			// create a statement
			PreparedStatement stmt = conn.prepareStatement(
			    "Select amount from PGINSUR.Payment where PAYMENTID ="
				+ paymentID);
			while (rs.next()) {
				amountPaid = Integer.parseInt(rs.getString(1));    
	   		}
			rs.close();
			stmt.close();
			conn.close();
			app = ApplicationFactory.createApplication();
			tran = app.getTransaction();	

			return amountPaid;
 		}catch(SQLException e) {
 			e.printStackTrace();
 			return -5;
 		}
	}
}   	

A Listagem 37 mostra o código JCL de amostra usado para
compilar um link com um programa OO COBOL. Os objetos do programa devem
residir em um PDSE. O tamanho da região deve ser definido para 96M ou
maior. O parâmetro PGMNAME(LONGMIXED) deve ser especificado para
compilação.

Listagem 37. INQPAY.jcl

//C EXEC PGM=IGYCRCTL,REGION=512M, // PARM='TEST(ALL,SYM,SEP),SOURCE,LIB,MAP,LIST,XREF,NOTERM, // THREAD,RENT,PGMNAME(LONGMIXED)' //STEPLIB DD DISP=SHR,DSN=IGYV3R40.SIGYCOMP // DD DISP=SHR,DSN=CEE.SCEERUN //SYSDEBUG DD DISP=SHR,DSN=IMS.SYSDEBUG(INQPAY) //SYSLIN DD DSN=IMS.OBJ(INQPAY), // DISP=(OLD,KEEP),SPACE=(CYL,(1,1,1)),UNIT=VIO //SYSLIB DD DISP=SHR,DSN=IMS.COPY //SYSPRINT DD DISP=SHR,DSN=IMS.LISTCOB(INQPAY) //SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT2 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT3 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT4 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT5 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT6 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSUT7 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(1,1)) //SYSIN DD DISP=SHR, // DSN=IMS.COBOL(INQPAY) // SET VAR= '/ENVAR("_CEE_ENVFILE=/Java/ENVAR")' // SET VAR2= 'POSIX(ON),XPLINK(ON)' //L EXEC PGM=IEWL, // PARM='&VAR &VAR2 RENT,LIST,LET,DYNAM(DLL), // CASE(MIXED),MAP,XREF,RMODE(ANY)', // COND=(4,LT,C) //RESLIB DD DSN=IMSNST.I11APAR.DBDC.CM1.SDFSRESL,DISP=SHR //SYSLIB DD DSN=SYS1.V1R3M2.COB2LIB,DISP=SHR // DD DISP=SHR,DSN=NEELA.MNA.S2U1F6.COPY // DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=CEE.SCEERUN,DISP=SHR // DD DSN=CEE.SCEELKED,DISP=SHR // DD DSN=IMS.SDFSRESL,DISP=SHR // DD DSN=IMS.PGMLIB,DISP=SHR //SYSLMOD DD DSN=IMS.PGMLIB(INQPAY),DISP=SHR,UNIT=VIO, // SPACE=(CYL,(1,1,1)),DSNTYPE=LIBRARY //SYSPRINT DD SYSOUT=* //SYSTERM DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(5,1)) //SYSDEFSD DD DUMMY //OBJMOD DD DSN=IMS.OBJ,DISP=(OLD,KEEP) //SYSLIN DD * INCLUDE OBJMOD(INQPAY) INCLUDE '/javaroot/java160/J6.0/bin/classic/libjvm.x' INCLUDE '/cob42/lib/igzcjava.x' //*

Resolução de problemas

O parâmetro JVMOPAS é necessário na região de
inicialização do MPP. Se o parâmetro não for especificado corretamente, a
região encerra com um U0101.

Se você receber a mensagem de erro ABEND=S000 U4088
REASON=000003EC, certifique-se de que o tamanho da região é de 96M ou mais.

Se você receber a mensagem de erro IEW2606S 4B39 MODULE INCORPORATES VERSION 3 PROGRAM OBJECT FEATURES AND CANNOT BE SAVED IN LOAD MODULE FORMAT, verifique se o objeto do programa reside em um PDSE.

Se você receber a mensagem de erro Cannot find the
libjvm.so file, crie um módulo como mostrado na Listagem 37 e
inclua o módulo criado na seção de ligação do JCL usado para compilar e
fazer ligação do programa OO COBOL.

A ligação JCL é mostrada na Listagem 38.

Listagem 38. Ligação JCL

//HLASM    EXEC PGM=ASMA90,PARM='LINECOUNT(0)'                    
//SYSPRINT DD SYSOUT=*                                            
//SYSUT1   DD UNIT=SYSDA,SPACE=(CYL,(1,1))                        
//SYSUT2   DD UNIT=SYSDA,SPACE=(CYL,(1,1))                        
//SYSUT3   DD UNIT=SYSDA,SPACE=(CYL,(1,1))                        
//SYSLIN   DD DSN=NEELA.MNA.S2U1F6.OBJ(SHAYCEE),DISP=SHR          
//SYSLIB   DD DSN=CEE.SCEEMAC,DISP=SHR                            
//         DD DSN=SYS1.MACLIB,DISP=SHR                            
//SYSIN    DD *                                                   
         TITLE 'CEEUOPT'                                          
CEEUOPT  CSECT                                                    
CEEUOPT  AMODE ANY                                                
CEEUOPT  RMODE ANY                                                
         CEEXOPT XPLINK=(ON),                                     
               POSIX=(ON),                                        
               STACK=(512K,512K,ANYWHERE,KEEP,512K,512K),         
               ENVAR=('_CEE_ENVFILE=/Java/ENVAR') 
         END                                                
//*//*    

Conclusão

Este artigo descreve como o IMS oferece várias soluções
para desenvolver e estender aplicativos em ambientes do cliente usando
Java. Como parte do IMS Versões 10 e 11, o IMS fornece ao driver
Universal Driver Database (driver IMS Universal) Java suporte para
conectividade tipo 2 dentro de regiões dependentes de IMS. Esse suporte
possibilita aos clientes desenvolver novos aplicativos em Java usando o
driver IMS Universal JDBC e no driver IMS Universal DL/I.

Recursos

Aprender

Obter produtos e tecnologias

Discutir