Tuesday 3 December 2024

Programe o uso de um recurso por uma tarefa (enfileirar).

Condições: ENQBUSY, INVREQ, LENGERR

Este comando é threadsafe se for definido como LOCAL. Não é threadsafe se for definido como GLOBAL.

Descrição:

ENQ faz com que a execução posterior da tarefa emitindo o comando ENQ seja sincronizada com a disponibilidade do recurso especificado; o controle é retornado à tarefa quando o recurso está disponível.

Um recurso no contexto deste comando é qualquer string de 1–255 bytes, estabelecida por padrões internos, para proteger contra ações conflitantes entre tarefas ou para causar thread único dentro de um programa.

Se uma tarefa for enfileirada em um recurso, mas não for removida dele, o CICS® libera automaticamente o recurso durante o processamento do ponto de sincronização (incluindo chamadas DL / I, PCB e TERM) ou quando a tarefa é encerrada. A opção UOW força o desenfileiramento no final de uma unidade de trabalho (UOW). A opção TASK força o desenfileiramento no final de uma tarefa. Se houver várias unidades de trabalho em uma tarefa, o enfileiramento transportará os UOWs.

Se mais de um comando ENQ for emitido para o mesmo recurso por uma determinada tarefa, o recurso permanecerá pertencente a essa tarefa até que a tarefa emita um número correspondente de comandos DEQ.

O recurso a ser enfileirado deve ser identificado por um dos seguintes métodos:

  • Especificando uma área de dados que é o recurso. É a localização (endereço) da área de dados no armazenamento que importa, não seu conteúdo.
  • Especificar uma área de dados que contém um argumento exclusivo (por exemplo, o nome de um funcionário) que representa o recurso. É o conteúdo do valor dos dados que importa, não sua localização. LENGTH é necessário; a presença da opção LENGTH informa ao CICS para enfileirar o conteúdo do valor de dados.

Quando um comando EXEC CICS ENQ (ou DEQ) é emitido para um recurso cujo nome corresponde a uma definição de recurso ENQMODEL instalada, o CICS verifica o valor do atributo ENQSCOPE para determinar se o escopo é local ou todo o sysplex. Se o ENQSCOPE não estiver em branco, o CICS tratará o ENQ ou DEQ como todo o sysplex e transmitirá um nome da fila e o nome do recurso para a serialização de recurso global z / OS para gerenciar o enfileiramento. Se o atributo ENQSCOPE for deixado em branco (o valor padrão), o CICS tratará o ENQ como local para a região emissora do CICS. Se nenhum ENQMODEL corresponder ao nome do recurso, o escopo do comando ENQ é local. 

Indisponibilidade de recursos

Se um recurso não estiver disponível quando o ENQ for emitido, o programa aplicativo será suspenso até que seja disponibilizado. No entanto, se a opção NOSUSPEND foi especificada e o recurso não está disponível, a condição ENQBUSY é levantada, pois também é levantada se você tiver uma condição HANDLE ativa. Isso permite que o programa aplicativo trate o caso de indisponibilidade do recurso (por HANDLE CONDITION ENQBUSY) sem esperar que o recurso fique disponível.

Opções:

LENGTH ( valor de dados )

especifica como um valor binário de meia palavra o comprimento do recurso a ser enfileirado. O valor deve estar no intervalo de 1 a 255; caso contrário, ocorre a condição LENGERR. Se a opção LENGTH for especificada em um comando ENQ, ela também deve ser especificada no comando DEQ para esse recurso e os valores dessas opções devem ser os mesmos. Você deve especificar LENGTH ao usar o método que especifica um valor de dados contendo um argumento exclusivo, mas não para o método que especifica uma área de dados como o recurso. É a presença ou ausência de LENGTH que informa ao CICS qual método você está usando.

MAXLIFETIME ( cvda )

especifica a duração do ENQ a ser liberado automaticamente pelo CICS. Os valores CVDA são:

UOW

A duração do ENQ é uma unidade de trabalho. Os exemplos são uma reversão de ponto de sincronização ou ponto de sincronização, se o aplicativo não emitir um DEQ antes que a unidade de trabalho termine. Este é o valor padrão.

Nota: Para compatibilidade, um valor CVDA de LUW também é suportado.

TAREFA

A duração do ENQ é uma tarefa. O enfileiramento transporta as unidades de trabalho dentro da tarefa. Use MAXLIFETIME (TASK) com muito cuidado porque outras tarefas que emitem comandos ENQ no mesmo recurso podem ser suspensas até o final desta tarefa.

Existem duas maneiras de codificar essa opção.

  • Você pode atribuir um valor CVDA com a rotina do conversor DFHVALUE. Isso permite que você altere um valor CVDA no programa. Por exemplo:

MOVE DFHVALUE(UOW) TO AREA-A

EXEC CICS ENQ RESOURCE(RESNAME)

              MAXLIFETIME(AREA-A)

 

  • Se a ação necessária for sempre a mesma, você pode declarar o valor diretamente. Por exemplo:

EXEC CICS ENQ RESOURCE(RESNAME) UOW

 

  • ou

EXEC CICS ENQ RESOURCE(RESNAME) TASK

 

NOSUSPEND

especifica que o programa de aplicativo não deve ser suspenso se o recurso no comando ENQ estiver indisponível, mas a condição ENQBUSY ocorrer.

Observe, entretanto, que se uma CONDIÇÃO DE MANIPULAÇÃO para ENQBUSY estiver ativa quando o comando é executado, a ação, o controle é passado para a etiqueta do usuário fornecida em CONDIÇÃO DE MANIPULAÇÃO. Isso tem precedência sobre a opção NOSUSPEND, mas é, obviamente, negado por NOHANDLE ou RESP.

RECURSO ( área de dados )

identifica o recurso a ser enfileirado por:

  • Especificar uma área cujo endereço representa o recurso.
  • Especificar uma variável que contém o recurso (um nome de funcionário, por exemplo). Neste caso, você deve usar a opção LENGTH.

Exemplos:

Duas tarefas, enfileirar o mesmo recurso e especificar uma área de dados que é o recurso, devem se referir ao mesmo local no armazenamento. Ambos podem, por exemplo, referir-se ao mesmo local no CWA.

EXEC CICS ENQ

     RESOURCE(RESNAME)

 

Duas tarefas, enfileirar o mesmo recurso e especificar uma área de dados que contém um argumento exclusivo, podem se referir ao mesmo local ou a locais diferentes, mas o conteúdo dos locais deve ser o mesmo. O comprimento deve ser fornecido na opção LENGTH.

EXEC CICS ENQ

     RESOURCE(SOCSECNO)

     LENGTH(9)

 

Os dois métodos não podem ser combinados. Se uma tarefa usar a opção LENGTH e a outra não, o CICS considerará os enfileiramentos com e sem a opção LENGTH como diferentes tipos de enfileiramentos e as tarefas não serão serializadas.