Compartilhar via


Método ICrmLogControl::RegisterCompensator (comsvcs.h)

O CRM Worker usa esse método para registrar o CRM Compensator com a infraestrutura crm. Ele deve ser o primeiro método chamado pelo CRM Worker e pode ser chamado com êxito apenas uma vez. Se o CRM Worker receber um código de erro de "recuperação em andamento" ao chamar esse método, ele deverá chamar esse método novamente até que ele receba êxito.

Sintaxe

HRESULT RegisterCompensator(
  [in] LPCWSTR lpcwstrProgIdCompensator,
  [in] LPCWSTR lpcwstrDescription,
  [in] LONG    lCrmRegFlags
);

Parâmetros

[in] lpcwstrProgIdCompensator

O ProgId do compensador crm. O CLSID do CrM Compensator no formulário de cadeia de caracteres também é aceito.

[in] lpcwstrDescription

A cadeia de caracteres de descrição a ser usada pelas interfaces de monitoramento.

[in] lCrmRegFlags

Sinalizadores da enumeração CRMREGFLAGS que controlam quais fases de conclusão de transação devem ser recebidas pelo Compensador de CRM e se a recuperação deve falhar se as transações em dúvida permanecerem após a tentativa de recuperação.

Retornar valor

Esse método pode retornar os valores a seguir.

Código de retorno Descrição
S_OK
O método foi concluído com sucesso.
E_POINTER
Um ponteiro NULL foi fornecido como um argumento.
E_UNEXPECTED
Ocorreu um erro inesperado.
XACT_E_NOTRANSACTION
O componente que cria o funcionário do CRM não tem uma transação.
XACT_E_RECOVERYINPROGRESS
A recuperação do arquivo de log crm ainda está em andamento.
XACT_E_RECOVERY_FAILED
Falha na recuperação do arquivo de log crm porque as transações em dúvida permanecem.
XACT_E_WRONGSTATE
Esse método foi chamado no estado errado; antes de RegisterCompensator ou quando a transação está sendo concluída (CRM Worker).
E_OUTOFMEMORY
Ocorreu um erro de memória insuficiente.
E_NOINTERFACE
O CrM Compensator não dá suporte a pelo menos uma das interfaces necessárias (ICrmCompensator ou ICrmCompensatorVariants).

Comentários

O parâmetro lCrmRegFlags permite que o implementador decida quais fases de conclusão de transação o Compensador do CRM deseja receber. Alguns compensadores de CRM podem não executar nenhum trabalho na fase de preparação e, portanto, não precisam receber notificações de preparação; ele pode melhorar o desempenho para especificar que nenhuma fase de preparação é necessária nesse caso.

É recomendável que os Operadores de CRM e os Compensadores de CRM sejam desenvolvidos como componentes encadeados "Ambos" (Modelo de Threading = Qualquer Apartamento). No entanto, em alguns casos, isso pode não ser possível devido a restrições de linguagem (por exemplo, ao desenvolver CRMs com o Visual Basic). Os compensadores de CRM com thread de apartment (Modelo de Threading = Apartamento de Thread Único) ficarão em deadlock na fase de preparação, a menos que sua propriedade de sincronização seja definida como "sem suporte". Outra alternativa para compensadores de CRM com thread de apartamento é ignorar a fase de preparação se não for necessário.

Em cenários com vários DTCs (Coordenadores de Transações Distribuídas), é possível que uma transação DTC possa entrar no estado em dúvida. Normalmente, isso ocorre porque ocorreu uma interrupção durante uma transação e o originador da transação não pode ser contatado para descobrir o resultado da transação. Nesse caso, a infraestrutura do CRM não pode determinar o resultado da transação. Um implementador crm pode decidir se novas transações devem ser permitidas nesse caso.

O sinalizador "fail if in-doubt remain" é usado da seguinte maneira: ao especificar o sinalizador "fail if in-doubt remain" no RegisterCompensator, se as transações em dúvida permanecerem após a recuperação, a chamada para RegisterCompensator falhará com um código de erro "falha na recuperação". Se o sinalizador "falhar se as dúvidas permanecerem" não for especificado, a recuperação será bem-sucedida, novas transações serão permitidas e as transações em dúvida permanecerão no arquivo de log crm. A infraestrutura do CRM tenta resolve essas transações em dúvida novamente na próxima recuperação (quando o processo do servidor de aplicativos é reiniciado).

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho comsvcs.h

Confira também

ICrmLogControl