Caros,
Estou com dificuldades no meu projeto Java EE. Dentre outras coisas, meu http endpoint possui uma funcionalidade que envolve upload de arquivos. Para persistir os uploads, vou ficar no feijão com arroz de sempre: guardar metadados a respeito do upload em um banco relacional, mas guardar o arquivo em si no sistema de arquivos do servidor.
Como vocês já devem estar imaginando, quero que tanto a escrita do arquivo no sistema quanto a gravação de dados no DB seja feita atomicamente.
Comecei a implementar manualmente a lógica de negócios em um EJB mas, quando me dei conta, estava com dezenas de linhas de código, sendo que a maioria continha lógica envolvendo a transação (commit, rollback e afins). Me pergunto: afinal, não é para isso que servem os XA resource managers? Comecei a procurar alguma biblioteca que funcionasse como um XA resource manager para file system. Encontrei algumas respostas no StackOverflow, encontrei uma biblioteca chamada XADisk, mas o “problema” é que muitas delas estão bem velhas (datam de 2013), não sei se é seguro utilizá-las.
Dado isso, minhas dúvidas são:
A: Estou pensando da melhor forma? Como lidar com sistema de arquivos do ponto de vista arquitetural?
B: Algum de vocês já utilizou algo parecido? Como eu devo fazer para garantir a saúde de minhas transações distribuidas envolvendo arquivos?
C: E do ponto de vista do JavaEE, como é que eu lido com sistemas de arquivos? Me dá uma sensação bem estranha acessar as pastas do sistema operacional pelo EJB, mesmo colocando o diretório alvo em uma propriedade dentro de um XML de configuração.
Obs: Por favor, se sua resposta envolve microservices, me mostre como pensar a respeito da coordenação da transação (é justamente isso que eu não quero fazer manualmente, quero que o Transaction Manager faça para mim, nada de reinventar a roda!).
Agradeço desde já!