3
respostas

EJB envio web service

Eu tenho um método que está com transação required. Executo o cadastro no banco de dados e após esse cadastro, eu quero enviar um webservice para um cliente.

No entanto, suponhamos que eu esqueci de colocar um max-length no input de um campo descrição. O usuário digitou 500 caracteres e no banco o tamanho está com 400.

Após o uso desse método, o ejb vai confirmar a transação somente no final do método, e quando tentar confirmar o banco vai retornar uma exceção por não conseguir cadastrar a mensagem e mesmo assim o webservice já foi enviado, pois não tinha ciência que a transação seria cancelada.

Eu já tentei montar assim.(Pseudocódigo)

NOT_SUPPORTED
meuPrimeiroMetodo(){
   meuMetodoComTransacaoCadastraNoBanco();
  meuMetodoWebService():
}

REQUIRED
meuMetodoComTransacaoCadastraNoBanco(){

}

NOT_SUPPORTED
meuMetodoWebService(){

}

No entanto, não funciona como esperado.

Como eu resolveria essa situação?

3 respostas

Fala Edson.

Talvez nesse caso, você possa optar pelo tratamento da exceção com rollback, trabalhando a ideia do "Tudo ou nada", também conhecida como atomicidade.

meuPrimeiroMetodo(){
    try {
        meuMetodoComTransacaoCadastraNoBanco();
        meuMetodoWebService();
    } catch(Exception e) {
        //Rollback
    }
}

Dessa forma, caso o método: meuMetodoComTransacaoCadastraNoBanco() retorne alguma exceção ele não executará o método: meuMetodoWebService() além de executar o rollback.

Veja mais aqui: https://www.devmedia.com.br/transacoes-no-ejb-enterprise-java-beans/25819

Espero ter ajudado!

Olá Allan, na verdade não é isso. Eu estou justamente querendo alcançar a ideia do acid.

No entanto, o envio de um webservice não é algo que eu possa confirmar no final.

É isso que o EJB está fazendo, ele executa o primeiro método mas não da um commit ainda na transação, após isso, o envio do webservice é disparado. Lembrando que aqui não há transação, ou seja, ele manda esse webservice.

No final, o banco de dados não aceita o tamanho do campo e gera-se um erro. Nessa hora, o envio do web service já foi feito.

Nesse caso Edson, só vendo o código pra ter uma ideia como um todo. Pra saber o que de fato está acontecendo em volta.

Se o seu código for sensível e você não puder postar aqui, tente montar um projeto a parte, sem correlação, pra postar aqui. Talvez fique mais fácil pra entender o problema.