2017-10-02 3 views
1

J'ai lu au sujet de la gestion des exceptions EJB et ceci est ma compréhension à ce jour:manipulation EDBException dans le code client

ASSUMER attribut transaction Bean B (serveur) est nécessaire:

  • exceptions du système doivent être jeté comme EJBException à l'appelant.
  • intercepte Container EDBException (ou toute autre exception non contrôlée) des enveloppes et jette à l'appelant
  • si l'appelant est en cours d'exécution dans une transaction l'instance du bean obtient éliminé et l'opération se fait annulée, l'appelant reçoit le EDBException enveloppé à l'intérieur d'une exception EJBTransactionRolledBackException.
  • Si l'appelant n'est pas dans une transaction, l'instance du bean est rejetée, l'appelant obtient l'exception EJBException dans une exception RemoteException.

Lorsque je l'exécute avec l'appelant trans. Attribut défini sur REQUIRED Je récupère l'exception EJBException dans une exception EJBTransactionRolledBackException.

Lorsque je l'exécute avec l'appelant trans. l'attribut mis à JAMAIS, j'attrape l'exception EJBException d'origine dans l'appelant, pas encapsulé dans une exception RemoteException

Pourquoi ne reçois-je pas l'exception RemoteException dans le second cas?

est ici une vue simplifiée de mes grains de l'appelant et serveur:

@Stateless 
    public class BeanA implements BeanAInterface{ 

    @Override 
    public void callBeanB() { 

    BeanBInterface beanBInterface; 
    try{ 
    beanBInterface = (BeanBInterface) new InitialContext().lookup(BeanBInterface.class.getName()); 
    beanBInterface.getResponse(); 
    } catch (Exception e){ 
     log.error("Caught Exception: " + e); 
     } 
    } 
    } 




    @Stateless 
    public class BeanB implements BeanBInterface{ 

    @Override 
    public void getResponse(){ 

     throw EJBException("Catch me."); 

    } 
    } 

EDIT:

Je viens de lire here que EDBException est jeté aux clients locaux et RemoteException aux clients distants. Dans mon exemple, le bean appelant fonctionne dans la même instance de serveur que le bean serveur, mais il se connecte via l'interface distante du bean serveur. Je suppose que je ne suis pas clair sur la définition de client distants vs local, mais il semble que je ne reçois pas l'exception RemoteException parce que mon client n'est pas distant.

Répondre

0

Assurez-vous que le conteneur utilise vraiment la télécommande et non l'interface locale.
Peut-être pensez-vous que vous appelez la télécommande, puisque c'est la télécommande dont vous parlez, mais le conteneur est en fait en train d'optimiser votre traitement de l'appel comme dans local. Je me souviens d'avoir été bloqué sur quelque chose de similaire, et seulement après un certain temps, j'ai reconnu que Jboss traitait les appels distants comme des appels locaux lorsque les deux EJB se trouvaient dans la même machine virtuelle. Dans mon cas, lorsque j'utilisais l'interface distante, le conteneur n'utilisait pas de valeur de transfert (objet sérialisé), mais transmettait la référence.

Donc, mon conseil: assurez-vous que vous êtes dans un "scénario à distance". Essayez d'utiliser deux serveurs d'application différents deux jbosses i et voir si quelque chose change.