Muitos aplicativos Java, incluindo os do lado do servidor e de desktop, mantêm seus dados críticos em sistemas de arquivos, bancos de dados e outros sistemas de informações. Para interação segura e robusta com esses dados cruciais, os desenvolvedores de aplicativos frequentemente procuram acesso transitório para esses sistemas de informações. Uma transação típica fornece as bem conhecidas propriedades de ACID , atomicidade, consistência, isolamento e durabilidade.
Os bancos de dados mais atuais têm suporte para transações. Para sistemas de arquivos, essa funcionalidade está indisponível ou é difícil de integrar com aplicativos Java. Torna-se impossível ou muito difícil associar uma transação a uma cadeia de caractere de operações de arquivos/diretórios. Sem transações, há riscos como resultados inesperados durante o travamento de aplicativos, acesso simultâneo ao mesmo conjunto de dados e mudanças parciais estando visíveis, etc.
Este artigo apresenta XADisk, um software livre de sistema de transações abrangente que permite acesso transacional a sistemas de arquivos de aplicativos Java e JavaEE. Com algumas APIs simples, é possível implementar XADisk sobre qualquer JVM sem requerer qualquer instalação no S.O. Uma vez implementados, aplicativos chamam as APIs do XADisk para executarem várias operações de E/S de arquivos dentro das transações.
XADisk fornece muitos outros recursos, como transações XA, conformidade total com JCA, sistema de mensagens de entrada e outros. Esses recursos estão fora do nível de introdução deste artigo.
Considere XADisk como uma camada entre aplicativos e sistemas de arquivos. XADisk não é uma implementação de sistema de arquivos em si; pode trabalhar com vários sistemas de arquivos (por exemplo, NTFS, FAT, ext3) e permitir que aplicativos acessem esses sistemas de arquivos de forma transitória. Aplicativos chamam APIs do XADisk para executarem várias operações de E/S e são capazes de confirmar ou retroceder todas elas como uma única transação.
XADisk foi escrito em Java e é executado em Java 5 ou acima. Pode ser usado por todos os tipos de aplicativos Java, aplicativos da web em execução em servidores Java, como o Apache Tomcat, e aplicativos JavaEE em execução em servidores JavaEE, etc.
Para um exemplo simples do uso de XADisk, considere um aplicativo Java. Esse aplicativo deseja criar um novo arquivo chamado F1, grave alguns dados nele de outro arquivo chamado F2 e, em seguida, exclua o F2. Essas três operações podem ser executadas dentro de uma única transação usando XADisk com garantias típicas das propriedades de ACID anteriormente mencionadas. XADisk manteria essas garantias mesmo se o aplicativo travasse no meio.
XADisk suporta várias operações em arquivos/diretórios:
- Arquivos— create, delete, move, copy, truncate, read, write, exists, getLength
- Diretórios— create, delete, move, list children, exists
Ao usar XADisk, um aplicativo e o sistema de arquivos de destino precisam estar na mesma máquina. É possível que um aplicativo chame as APIs de XADisk remotamente da mesma maneira que XADisk implementou na mesma JVM.
O restante deste artigo cobre algumas etapas simples para iniciar o uso de XADisk em qualquer aplicativo Java.
Antes de chamar operações de E/S de XADisk, inicialize uma instância XADisk dentro de uma JVM. Na mesma JVM, pode haver diversas instâncias de XADisk; cada instância de XADisk terá seu próprio estado isolado. Este artigo demonstra como inicializar e chamar uma dessas instâncias de XADisk.
Como é possível inicializar XADisk em qualquer JVM, é possível usá-lo em diversos ambientes Java, desde programas Java simples a servidores JavaEE, como JBoss, e servidores da web, como Tomcat.
Para inicializar uma instância de XADisk, o seguinte é necessário no ambiente do sistema:
- Java5 ou acima
- XADisk.jar (faça download a partir de http://xadisk.java.net/)
- JCA 1.5 Jar (faça download a partir de http://download.java.net/maven/1/javax.resource/jars/connector-api-1.5.jar)
Durante a inicialização, XADisk aceita um objeto de configuração para suas várias propriedades de configuração. A maioria das propriedades de configuração tem seus valores padrão configurados. Apenas SystemDirectory e InstanceId são obrigatórias. Como mostra a Listagem 1, o construtor da configuração aceita essas duas propriedades de configuração. SystemDirectory é um diretório no qual XADisk mantém todos os seus artefatos (por exemplo, logs de transações) necessários para seu funcionamento. InstanceId identifica de forma exclusiva uma instância de XADisk em uma JVM.
Listagem 1. Configurar e inicializar uma instância de XADisk
String XADiskSystemDirectory =“/home/systems/XADiskSystem1";
StandaloneFileSystemConfiguration configuration =
new StandaloneFileSystemConfiguration(XADiskSystemDirectory, “instance-1”);
XAFileSystem xaf = XAFileSystemProxy.bootNativeXAFileSystem(configuration);
xaf.waitForBootup(10000L);
|
A cadeia de caractere acima conclui a configuração de uma instância do XADisk e entra em uma espera para que conclua o processo de inicialização. Após a inicialização ser concluída, essa instância de XADisk está disponível para uso por aplicativos na mesma JVM ou em JVMs remotas.
Observe que uma referência do tipo XAFileSystem é o ponto de entrada para iniciar a chamada de operações em uma instância de XADisk. Essa referência de XAFileSystem pode ser obtida:
- Durante a inicialização, conforme mostrado na Listagem 1.
- Usando o método instanceId a partir de qualquer lugar na JVM, conforme mostrado na Listagem 2.
Listagem 2. Obtendo a referência de XAFileSystem para a instância de XADisk a mesma JVM.
XAFileSystem xaf = XAFileSystemProxy.getNativeXAFileSystemReference(“instance-1”);
|
- Por aplicativos remotos, conforme mostrado na A Listagem 3.
Listagem 3. Obtendo a referência de XAFileSystem para a instância de XADisk em uma JVM remota.
XAFileSystem xaf = XAFileSystemProxy.getRemoteXAFileSystemReference("10.30.9.200", 5151);
/*the parameters are the serverAddress and serverPort configuration properties
used during booting of the remote XADisk instance. Note that remoting to
an XADisk instance is disabled by default and can be enabled
using configuration.setEnableRemoteInvocations(true) during bootup*/
|
Agora que a instância de XADisk está pronta, as operações transitórias podem ser iniciadas nos arquivos/diretórios.
Após obter a referência de XAFileSystem , o método de chamar APIs de
XADisk permanece o mesmo, independentemente de se a instância de XADisk de destino está em execução na mesma JVM ou em uma remota.
Como as operações de arquivos/diretórios estariam ocorrendo dentro de uma transação, primeiro inicie uma transação criando uma
sessão, como mostra a A Listagem 4.
Listagem 4. Criar uma sessão e iniciar uma transação
Session session = xaf.createSessionForLocalTransaction(); |
Após termos a sessão, as operações de E/S podem ser executadas conforme necessário. As APIs de XADisk para as operações de arquivos/diretórios são diretas. Listagem 5 mostra alguns exemplos.
Listagem 5. Chamar APIs de XADisk para operações de arquivos/diretórios
File f = new File("/testAPIs/test.txt");
if(session.fileExists(f)) {
XAFileInputStream xis = session.createXAFileInputStream(f);
for (int i = 0; i < 100; i++) {
byte a = (byte) xis.read();
if( a== -1) {
break;
}
System.out.print(a);
}
xis.close();
session.moveFile(f, new File("/testAPIs/test.txt___” + System.currentTimeMillis()));
}
else {
//use false below to create file, true for directory
session.createFile(f, false);
//use false below for tiny write operations, true otherwise
XAFileOutputStream xafos = session.createXAFileOutputStream(f, false);
byte[] buffer = new byte[100];
for (int i = 0; i < 100; i++) {
buffer[i] = i*i;
}
xafos.write(buffer);
xafos.close();
}
/* You can do more operations here, by calling Session APIs
for reading/writing/creating/deleting/updating/copying/moving files
and directories. For details, please see the XADisk JavaDoc for
interface named XADiskBasicIOOperations.*/
|
Após concluir todas as operações de E/S, podemos conformar (ou retroceder) a transação com uma chamada simples ao objeto de sessão, conforme mostrado na Listagem 6.
Listagem 6. Confirmar ou retroceder a transação associada à sessão
//commit the transaction session.commit(); //or rollback the transaction session.rollback(); |
para iniciar uma nova transação, crie um novo
objeto de Sessão e siga as mesmas etapas mostradas na
Listagem 5
É possível encerrar uma instância de XADisk a partir de qualquer lugar na JVM, conforme mostrado na Listagem 7.
Listagem 7. Encerrar uma instância de XADisk a partir da mesma JVM
XAFileSystem xaf = XAFileSystemProxy.getNativeXAFileSystemReference(“instance-1”); xaf.shutdown(); |
Aplicativos que mantêm seus dados críticos em sistemas de arquivos podem observar um benefício significativo usando transações com os sistemas de arquivos. XADisk é uma solução de software livre disponível gratuitamente que permite que aplicativos interajam com sistemas de arquivos usando transações. Fornece APIs simples para inicialização, execução de várias operações de arquivos/diretórios e gerenciamento de transações.
XADisk pode fazer muito mais. Visite os links em Recursos para obter informações adicionais, código de amostra e para participar de discussões de tecnologia.
Aprender
- Transaction
processing e ACID: Consulte essas páginas da Wikipédia se você for iniciante para transações.
- Zona de software livre do developerWorks: encontre informações práticas, ferramentas e atualizações de projeto amplas para ajudá-lo a desenvolver com tecnologias de software livre e utilizá-las com produtos IBM.
- Eventos interessantes: confira futuras conferências, exposições e webcasts interessantes para desenvolvedores de software livre IBM.
- Podcasts do developerWorks: escute entrevistas e explicações interessantes para desenvolvedores de software
- demos do developerWorks: Acompanhe nossas demos gratuitas e saiba mais sobre as tecnologias IBM e de software livre e funções dos produtos.
- DeveloperWorks no Twitter: siga-nos para acompanhar as últimas notícias.
Obter produtos e tecnologias
- XADisk home page: Saiba mais sobre XADisk, acesse guias de usuários e obtenha JavaDoc e códigos de amostra.
- Avalie produtos de software IBM: a partir de downloads de teste para produtos hospedados na nuvem, é possível inovar no seu próximo projeto de desenvolvimento de software livre usando software especialmente para desenvolvedores.
Discutir
- XADisk Discussion
Group: Discuta qualquer coisa relacionada a XADisk
- comunidade do developerWorks: Conecte-se a outros usuários do developerWorks enquanto explora os blogs, fóruns, grupos e wikis voltados para desenvolvedores. Ajude a desenvolver o software livre do mundo real na comunidade do developerWorks.