API da Atividade de Negócios

Utilize a API (interface de programação de aplicativos) para criar os manipuladores de atividades e compensação para um componente de aplicativo e registrar dados necessários para compensar uma atividade se houver uma falha na atividade de negócios geral.

Visão geral

O suporte de atividade de negócios fornece uma API UserBusinessActivity e duas interfaces: serializable.CompensationHandler e CompensationHandler. Cada interface tem duas exceções: RetryCompensationHandlerException e CompensationHandlerFailedException. É possível procurar a interface UserBusinessActivity a partir do servidor de aplicativos JNDI (Java™ Naming and Directory Interface) em java:comp/websphere/UserBusinessActivity. Por exemplo:
InitialContext ctx = new InitialContext();
UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup("java:comp/websphere/UserBusinessActivity");
É possível usar o método getId para acessar o identificador exclusivo para a atividade de negócios atualmente associada ao encadeamento de chamada. O identificador é igual ao gerado para o escopo de atividade de negócios no tempo de execução e é utilizado para informações, aviso e mensagens de erro. Por exemplo, o aplicativo pode usar o identificador em mensagens de auditoria ou de diagnóstico, e é possível correlacionar as mensagens geradas pelo aplicativo e pelo tempo de execução.
InitialContext initialContext = new InitialContext();
UserBusinessActivity uba = initialContext.lookup("java:comp/websphere/UserBusinessActivity"); 
… 
String activityId = uba.getId(); 
if (activityId == null)
// Nenhuma atividade no encadeamento 
else
// Mensagem de auditoria de saída incluindo id de atividade
Se um componente de aplicativo executar algum trabalho que possa exigir compensação após a falha na atividade de negócios, você deverá fornecer uma classe de manipulador de compensação que seja montada como parte do aplicativo implementado. Essa classe Java deve implementar uma das seguintes interfaces:
  • com.ibm.websphere.wsba.serializable.CompensationHandler, que utiliza um parâmetro de um objeto serializável
  • com.ibm.websphere.wsba.CompensationHandler, que utiliza um parâmetro de um SDO (Service Data Object)
Geralmente, os aplicativos que já tiveram seus dados disponíveis no formato DataObject utilizarão a interface CompensationHandler, e os aplicativos que não tiverem utilizarão a interface serializable.CompensationHandler. As duas interfaces suportam os métodos close e compensate.

Um aplicativo deve registrar uma implementação do manipulador de compensação que funcione com o tipo de dados de compensação (objeto serializável ou SDO) que o aplicativo utiliza. Se houver uma incompatibilidade entre o tipo de dados que o componente de aplicativo utiliza e a implementação do manipulador de compensação, haverá um erro.

Durante o processamento de aplicativo normal, o aplicativo poderá fazer uma ou mais chamadas aos métodos setCompensationDataImmediate ou setCompensationDataAtCommit, transmitindo um objeto serializável ou um SDO que represente o estado atual do trabalho executado.

Quando o UOW (Underlying Unit of Work) ao qual a atividade de negócios raiz está associada é concluído, todos os compensadores registrados serão coordenados para a conclusão. Durante a conclusão, o método compensate ou close é chamado no manipulador de compensação, transmitindo os dados de compensação mais recentes registrados pelo componente de aplicativo como um parâmetro. A implementação do manipulador de compensação deve ser capaz de entender os dados armazenados no objeto serializável ou no SDO DataObject; ao usar esses dados, o manipulador de compensação deverá estar apto a determinar a natureza do trabalho executado pelo enterprise bean e ser compensado ou fechado de maneira apropriada, por exemplo, desfazendo as mudanças feitas nas linhas do banco de dados, se houver uma falha na atividade do negócio. Associe o manipulador de compensação a um componente aplicativo utilizando as ferramentas de montagem, como o Rational Application Developer.

Manipuladores de Compensação Ativos e Inativos

Implemente a interface serializable.CompensationHandler ou CompensationHandler para qualquer componente de aplicativo que execute código que possa precisar ser compensado em um escopo de atividade de negócios. Os objetos do manipulador de compensação são registrados implicitamente com o escopo de atividade de negócio sob o qual o aplicativo executa, sempre que o aplicativo chama a API do UserBusinessActivity para especificar os dados da compensação. Os manipuladores de compensação podem ter dois estados, ativo ou inativo, dependendo de qualquer UOW transacional em que estão registrados. Um manipulador de compensação registrado em um UOW transacional pode inicialmente ser inativo até as execuções da transação, ponto no qual o manipulador da compensação se torna ativo (consulte a seção seguinte). Uma rotina de tratamento de compensação registrada fora de uma UOW transacional sempre fica ativa imediatamente.

Quando uma atividade de negócio é concluída, ela aciona apenas os manipuladores de compensação ativa. Quaisquer manipuladores de compensação ativos associados à atividade de negócios são descartados e nunca conduzidos.

Registrando Dados de Compensação

A API da atividade de negócios especifica dois métodos que permitem o registro da compensação de dados. Esses dados são disponibilizados para os manipuladores de compensação durante seu processamento quando a atividade de negócio é concluída. O aplicativo chama um desses métodos, dependendo se ele espera que as transações façam parte da atividade de negócios.

setCompensationDataAtCommit()
Chame o método setCompensationDataAtCommit quando o aplicativo esperar uma transação global no encadeamento.
  • Se uma transação global estiver presente no encadeamento, o objeto CompensationHandler ficará inicialmente ativo. Se a transação global falhar, ela será revertida para qualquer trabalho transacional feito nesse contexto de transação de uma maneira atômica e conduzirá a atividade de negócios para compensar outros UOWs concluídos. O manipulador de compensação não precisa estar envolvido. Se a transação global for executada com êxito, o manipulador de compensação se tornará ativo porque se a atividade de negócio geral falhar, o manipulador de compensação será necessário para compensar o trabalho durável concluído pela transação global. O método setCompensationDataAtCommit configura a instância CompensationHandler para executar essa função de compensação.
  • Se uma transação global não estiver presente quando o método setCompensationDataAtCommit for chamado, o manipulador de compensação ficará ativo imediatamente.
Por exemplo, para um SDO, e usando a mesma instância de atividade de negócios que no exemplo anterior:
DataObject compensationData = doWorkWhichWouldNeedCompensating();
uba.setCompensationDataAtCommit(compensationData); 
setCompensationDataImmediate()

Chame o método setCompensationDataImmediate quando o aplicativo não esperar uma transação global no encadeamento.

O método setCompensationDataImmediate torna uma instância CompensationHandler ativa imediatamente, independente do contexto atual do UOW no momento que o método é chamado. O manipulador de compensação sempre pode participar durante a conclusão da atividade de negócios.

A função do método setCompensationDataImmediate é compensar qualquer trabalho não transacional, em outras palavras, trabalho que possa ser executado dentro ou fora de uma transação global, mas que não seja controlado pela transação. Um exemplo desse tipo de trabalho é enviar um e-mail. O manipulador de compensação deve ficar ativo imediatamente para que, se uma falha ocorrer em uma atividade de negócio, esse trabalho não transacional seja sempre compensado.

Por exemplo, para um objeto serializável, e usando a mesma instância de atividade de negócios que no exemplo anterior:
Serializable compensationData = new MyCompensationData();
uba.setCompensationDataImmediate(compensationData); 

Embora esses dois métodos de criação de log de dados de compensação, se chamados no mesmo enterprise bean, utilizem a mesma classe do manipulador de compensação, eles criam duas instâncias separadas da classe do manipulador de compensação no tempo de execução. Portanto, as ações dos métodos são mutuamente exclusivas; chamar um dos métodos não sobrescreve nenhum trabalho executado pelo outro método.

Se uma instância do manipulador de compensação já tiver sido incluída na Atividade de Negócios usando um desses métodos e, em seguida, o mesmo método for chamado, passando null como parâmetro, essa instância do manipulador de compensação será removida da atividade de negócios e não será conduzida para fechamento ou compensação durante a conclusão da atividade de negócios.

Conforme descrito anteriormente, o suporte da atividade de negócios inclui uma instância do manipulador de compensação à atividade de negócios quando um método de criação de log de dados de compensação é chamado pela primeira vez pelo enterprise bean que utiliza a atividade de negócios. Ao mesmo tempo, uma captura instantânea do contexto do aplicativo corporativo é utilizada e registrada com os dados de compensação. Quando a atividade de negócios disputa, todos os manipuladores de compensação incluídos à atividade de negócios são conduzidos para compensate ou close. O código que você cria na classe CompensationHandler ou serializable.CompensationHandler tem sua execução garantida no mesmo contexto de aplicativo corporativo obtido na captura instantânea anterior.

Para obter detalhes sobre os métodos disponíveis na API de atividade de negócios, consulte o tópico sobre APIs adicionais.

Ícone que indica o tipo de tópico Tópico de Referência



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rjta_wsba_api
Nome do arquivo: rjta_wsba_api.html