O Java Transaction Service sem o servidor de aplicativos

5

É possível ter um aplicativo independente de Java (nenhum servidor de aplicativos conectado) que exponha algumas operações que um cliente pode chamar e seja o único a gerenciar as transações?

Eu estava pensando neste aplicativo para expor recursos da JNDI e ter acesso a um java: comp / UserTransaction de lá, obter também um bean de lá e chamar os métodos A, B e C nele e coordenar a transação do cliente?

O aplicativo que estou escrevendo não é complexo o suficiente para que eu precise de um grande servidor de aplicativos em torno dele, então estou pensando em ter um JTS independente dentro dele que o cliente possa interagir do ponto de vista de transações.

Eu não tenho muita experiência com transações distribuídas e realmente não sei como lidar com o problema. É mesmo possível? Eu estou me metendo em algo além do que um mero mortal (programador) pode lidar?

Como posso abordar isso?

    
por johnny 10.07.2012 / 14:37
fonte

2 respostas

1
O Jboss e outros fornecedores de servidores de aplicativos oferecem um gerenciador de transações autônomo que pode ser usado autônomo.

The JBoss Transaction Service (JBossTS) protects businesses from data corruption by guaranteeing complete, accurate business transactions for Java based applications (including those written for the JEE and EJB frameworks) thereby eliminating the risks and costs associated with time-consuming manual reconciliation following failures...

    
por 10.07.2012 / 17:54
fonte
3

O serviço JNDI simples é simples, o gerenciamento de transações distribuídas é difícil

Existe um tutorial abrangente sobre JNDI fornecido pela Oracle. Embora pareça datado (JDK 1.1.2 qualquer um?), A especificação JNDI não mudou muito no tempo de intervenção e ainda é relevante. A leitura cuidadosa dos exemplos fornecerá informações suficientes para que você possa construir um aplicativo independente capaz de servir objetos internos em resposta a solicitações JNDI.

Tem certeza de que precisa de transações distribuídas?

Sua segunda pergunta é lidar com transações distribuídas. Existem várias maneiras de interpretar uma transação distribuída com base no nível de colaboração entre aplicativos.

No caso simples, você teria um fluxo de trabalho assim:

  1. O aplicativo A envia um pacote de trabalho para o Aplicativo B sobre HTTP
  2. O aplicativo B tenta confirmar isso no banco de dados. Se bem sucedido, um 200 OK é retornado, caso contrário, algum código de erro é usado.
  3. O aplicativo A sabe como reagir adequadamente a uma falha.

É evidente que você não precisaria que o JNDI implementasse esse tipo de fluxo de trabalho, além de permitir que seu aplicativo (Aplicativo C) fornecesse o Aplicativo B com o conjunto de conexões do banco de dados (Dica: use C3P0 para isso).

No caso complexo, você teria um fluxo de trabalho mais parecido com isto:

  1. O aplicativo A registra o início de uma transação distribuída com o Aplicativo C e, em seguida, trabalha com o banco de dados para fazer algum trabalho.
  2. O aplicativo A conclui parte da transação geral e passa para o Aplicativo B para finalizá-lo. O aplicativo A notifica o aplicativo C do status.
  3. O aplicativo B registra sua parte da transação com o Aplicativo C e tenta concluir seu trabalho. Se falhar, o Aplicativo C saberá como orquestrar a reversão (talvez usando o gerenciamento de transações aninhadas).

Se você está procurando um fluxo de trabalho como o caso complexo, então eu diria que você deve considerar um contêiner de aplicativos para gerenciá-lo. Caso contrário, talvez você nem precise do JNDI.

    
por 10.07.2012 / 16:08
fonte