Je vais essayer de décrire la situation. Nous avons un service web à chaque demande, le service Web démarre une transaction JTA. Il effectue plusieurs appels de base de données via la source de données XA et appelle d'autres services Web (hors contexte de transaction) et effectue également quelques appels EJB distants sur un autre serveur. Le problème est que le conteneur semble essayer d'impliquer EJB dans la transaction (et cela semble logique), mais en fait je veux qu'il ne participe pas à cette transaction car quand il participe à cette transaction, il expire toujours dans le phase de validation finale, mais quand j'exclus l'appel d'EJB cela fonctionne très bien.Effectuer un appel EJB sans transaction dans une transaction
Je ne peux pas modifier l'implémentation d'EJB et contrôler uniquement le code de service Web. Donc, ma question est: comment puis-je faire un appel EJB à l'EJB de transaction, mais hors de ma transaction JTA, mais toujours en transaction JTA pour d'autres ressources XA? J'espère avoir clarifié ma question :)
EDIT: Essayer de le rendre plus clair l'exemple pseudo-code:
// Begin transaction
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
tx.begin();
// Do some database operations on XA datasource
// Call remote EJB which has transcation attribute set to 'Supports'
AccountInfo account = accountEjb.getAccountInfo(userId, accountId); // <-- Is it possible to make this to be not be part of user transction?
// Do some more database operations on XA datasource
// Commit transaction
tx.commit();
pourquoi ne pas augmenter le délai d'attente? –
car le problème n'est pas dans le délai d'expiration, tous les appels passent juste ok dans les millisecondes, mais lorsque la transaction est validée à la fin, il expire, si l'appel ejb est retiré de la séquence d'appel, il valide ok. Donc, je pense qu'il doit faire quelque chose avec la communication inter-serveur, mais pas la valeur du timeout. –