Use esta tarefa para criar uma interação entre as APIs de saída e o subsistema ou o
espaço de endereço externo.
Antes de Iniciar
Estabeleça uma conexão a um subsistema ou espaço de endereço externo conforme descrito no
tópico, Usando os Adaptadores Locais Otimizados para Chamar um Subsistema ou Espaço de Endereço Externo
de um aplicativo WebSphere Application Server no z/OS.
Procedimento
- Opcional: Inicie a transação local do gerenciador de recursos
(RMLT) se você estiver usando uma tarefa do servidor Customer Information Control System (CICS) que suporta transações. Para usar uma tarefa de servidor CICS que suporta transações,
a palavra-chave TXN=Y é usada ao iniciar a tarefa de servidor. É possível iniciar
um RMLT para encapsular várias interações em uma única unidade de trabalho. Seu componente de aplicativo Java™ Enterprise
Edition (Java EE) não deve estar em
execução em uma transação global e deve ter um limite
LocalTransaction configurado para Aplicativo no seu descritor de implementação
de aplicativo. O exemplo a seguir mostra como iniciar
uma transação local usando o objeto LocalTransaction, após
o descritor de implementação ter sido alterado:
LocalTransaction lt = con.getLocalTransaction();
lt.begin();
Para obter informações adicionais sobre como alterar a configuração de LocalTransaction
em um descritor de implementação do aplicativo, consulte o tópico Configurando os Atributos
de Implementação Transacionais.
Se seu componente de aplicativo Java EE estiver configurado para usar
o limite LocalTransaction, ContainerAtBoundary,
a conexão será listada automaticamente em um RMLT quando a conexão for obtida. O trabalho feito quando usar essa conexão é concluído automaticamente quando o
componente de aplicativo Java EE ser finalizado.
Se seu componente de aplicativo Java EE
estiver iniciando em uma transação global, o conector será listado automaticamente na
transação global quando a conexão for obtida. O trabalho feito quando usar essa conexão é concluído automaticamente quando o componente de aplicativo Java EE ser finalizado. O objeto ConnectionFactory usado para obter sua conexão
deve ter a propriedade customizada RegisterName configurada para participar
de uma transação global.
- Crie uma interação usando o objeto de conexão, por exemplo:
Interaction int = con.createInteraction();
- Crie um objeto InteractionSpecImpl e configure o nome do serviço para a especificação
de interação. O nome do serviço descreve o nome do método ou função que você deseja chamar no sistema remoto. O nome do serviço que foi fornecido quando o sistema remoto chamou o host ou uma das APIs
Receber Solicitação, ou quando usar a tarefa do servidor Customer Information Control System (CICS),
é o nome do programa para iniciar dentro do CICS, por exemplo:
InteractionSpecImpl isi = new InteractionSpecImpl();
isi.setServiceName("MYSERVICE");
Atenção: Quando usar os adaptadores locais otimizados sobre o OTMA,
o nome do serviço não será definido e a transação do IMS de destino será especificada no fluxo de mensagem. O nome do serviço pode ser configurado, mas não é usado para os adaptadores locais otimizados sobre o OTMA. Para obter mais informações, consulte o tópico, Chamando Transações IMS Existentes com
Adaptadores Locais Otimizados sobre OTMA.
- Execute a interação usando a especificação de interação criada, por exemplo:
int.execute(isi, null);
- Se seu aplicativo usou um RMLT,
confirme ou restaure o trabalho depois de concluir sua última interação. Use os métodos commit ou rollback no objeto
LocalTransaction, por exemplo:
lt.commit();
Resultados
A interação ao subsistema ou espaço de endereço externo
deve estar completa.
Atenção: Quando usar uma
RMLT ou uma transação global, se o aplicativo CICS emitir um ponto
de sincronização durante a RMLT ou transação global, a tarefa do servidor emitirá
um encerramento de forma anormal BBOX durante o ponto de sincronização. Isso faz com que o ponto
de sincronização falhe e um encerramento de forma anormal ASPx seja gerado peloCICS. O aplicativo CICS deve aguardar o WebSphere Application
Server emitir a operação do ponto de sincronização ao chamar o método
commit ou rollback no objeto LocalTransaction ou ao permitir que o componente de aplicativoJava EE seja concluído.
Atenção: Se desejar definir
o tempo máximo que uma transação CICS pode ser executada quando um contexto de transação global
ou RMLT for importado para o CICS a partir do WebSphere, modifique o valor de parâmetro OTSTIMEOUT
na definição de transação usada para iniciar
a tarefa do link de servidor de link CICS. Por padrão, o nome da transação é BBO#. Se o tempo de execução de transação do CICS exceder o tempo especificado
pelo parâmetro OTSTIMEOUT, a tarefa do CICS que está executando a transação CICS será encerrada anormalmente, causando o retrocesso
de toda a transação global ou RMLT. Para obter informações adicionais sobre como
codificar o parâmetro OTSTIMEOUT na definição de transação, consulte o
Guia de Definição de Recursos do CICS Transaction Server
for z/OS.
Se seu componente de aplicativoJava EE estiver participando de um RMLT ou de uma transação global,
e o aplicativo estiver se comunicando com um programa em lote ou com um servidor de link CICS iniciado com a palavra-chave TXN=N, a conexão do adaptador local
otimizado não poderá estabelecer uma conexão com o programa de destino. O programa de destino não pode fornecer as capacidades de transação necessárias pelo aplicativo Java EE. É exibida uma exceção com o código menor 0xC9C24C3B. Este código indica
que o nome de registro de destino foi localizado, mas não está ativado
para transações. Apenas os servidores de link CICS
ativados com a palavra-chave TXN=Y podem suportar a propagação de transações
do WebSphere Application
Server para z/OS.
Exemplo
O seguinte método mostra como iniciar uma interação com os dados
de entrada e de saída como uma matriz de bytes (byte[]):
public byte[] driveInteraction(javax.resource.cci.ConnectionFactory cf,
javax.resource.cci.Connection con,byte[] inputDataBytes),throws javax.resource.ResourceException
{
// Crie uma interação usando a conexão do adaptador local otimizado
javax.resource.cci.Interaction i = con.createInteraction();
// InteractionSpec descreve o serviço que desejamos chamar
com.ibm.websphere.ola.InteractionSpecImpl isi = new com.ibm.websphere.ola.InteractionSpecImpl();
isi.setServiceName("MYSERVICE");
// Os dados de entrada são especificados usando um IndexedRecord. O primeiro
// slot no registro indexado contém os bytes dos dados de entrada.
javax.resource.cci.RecordFactory rf = cf.getRecordFactory();
javax.resource.cci.IndexedRecord ir = rf.createIndexedRecord(null);
ir.add(inputDataBytes);
// A interação retorna outro IndexedRecord, cujo primeiro
// slot contém os bytes de dados de saída.
javax.resource.cci.Record or = i.execute(isi, ir);
byte[] outputDataBytes = null;
if (or != null)
{
outputDataBytes = (byte[])((javax.resource.cci.IndexedRecord)or).get(0);
}
// Retorne os dados de saída ao responsável pela chamada
return outputDataBytes;
}
O seguinte método mostra como iniciar uma interação usando um objeto
Record do copybook gerado pelo Rational Application Developer:
/**
* Um exemplo de condução de uma interação do adaptador local otimizada, usando uma
* classe de mapeamento de copybook do Rational Application Developer como entrada (inputRecord) e um recebimento
* de um mapeamento de copybook do Rational Application Developer como saída.
*/
public javax.resource.cci.Record driveInteraction(
javax.resource.cci.Connection con,
javax.resource.cci.Record inputRecord)
throws javax.resource.ResourceException
{
// Crie uma interação usando a conexão OLA
javax.resource.cci.Interaction i = con.createInteraction();
// InteractionSpec descreve o serviço que desejamos chamar com.ibm.websphere.ola.InteractionSpecImpl isi =
new com.ibm.websphere.ola.InteractionSpecImpl();
isi.setServiceName("MYSERVICE");
// O Rational Application Developer gerou implementações de copybook
// javax.resource.cci.Record e pode ser transmitido diretamente para a interação.
// A interação retorna um IndexedRecord, cujo primeiro slot contém
// bytes de dados de saída.
javax.resource.cci.Record or = i.execute(isi, inputRecord);
javax.resource.cci.Record outputRecord = null;
if (or != null)
{
// Neste exemplo, RADGeneratedOutputType é o nome da classe de mapeamento de
// copybook gerada pelo Rational Application Developer.
outputRecord = new RADGeneratedOutputType();
// Os bytes de saída são armazenados no registro de saída retornado na
// interação, que é um IndexedRecord.
byte[] outputDataBytes =
(byte[])((javax.resource.cci.IndexedRecord)or).get(0);
// Para converter os bytes de saída para outro copybook gerado pelo Rational Application Developer,
// chame o método setBytes(byte[]) dessa classe. A classe
// implementará a interface com.ibm.etools.marshall.RecordBytes.
((com.ibm.etools.marshall.RecordBytes)outputRecord)
.setBytes(outputDataBytes);
}
// Retorne os dados de saída ao responsável pela chamada
return outputRecord;
}