Domanda

Io corro due domini v2 GlassFish contenenti EJB di sessione senza stato. In alcuni casi, un EJB in un dominio deve chiamare uno nell'altro.

Il mio problema è che quando l'utente chiamato Aborts EJB con un'eccezione, il chiamante non riceve il messaggio di eccezione e invece segnala un errore interno che non è utile a tutti per diagnosticare il problema. Quello che succede sembra essere questo:

  • Al livello di trasporto, viene creato un org.omg.CORBA.portable.ApplicationException, che perde già tutte le informazioni dettagliate circa l'eccezione ad eccezione della categoria.
  • All'interno com.sun.jts.CosTransactions.TopCoordinator.get_txcontext(), lo stato della transazione asino rotolato provoca di nuovo un org.omg.CosTransactions.Unavailable ad essere gettato, che viene avvolto e passato in giro un paio di volte e alla fine si traduce in questo errore viene visualizzato all'utente:

    org.omg.CORBA.INVALID_TRANSACTION:   vmcid: 0x0  minor code: 0  completed: No
    at com.sun.jts.CosTransactions.CurrentTransaction.sendingRequest(CurrentTransaction.java:807)
    at com.sun.jts.CosTransactions.SenderReceiver.sending_request(SenderReceiver.java:139)
    at com.sun.jts.pi.InterceptorImpl.send_request(InterceptorImpl.java:344)
    at com.sun.corba.ee.impl.interceptors.InterceptorInvoker.invokeClientInterceptorStartingPoint(InterceptorInvoker.java:271)
    at com.sun.corba.ee.impl.interceptors.PIHandlerImpl.invokeClientPIStartingPoint(PIHandlerImpl.java:348)
    at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:284)
    at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:184)
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:186)
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
    at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
    

C'è qualcosa che posso fare qui per conservare informazioni sulla causa effettiva del problema?

È stato utile?

Soluzione 3

Finalmente ho avuto modo di fondo di questo: in realtà, trasmette Glassfish eccezioni attraverso IIOP molto correttamente e tutto funziona come dovrebbe ... a meno che non si fa qualcosa di stupido come questo:

try{
    ejb.getFoo();
}catch (Exception e){
    // try again
    ejb.getFoo();
}

Sì, è stato il nostro codice maledetto che ha ingoiato l'eccezione e ha cercato di chiamare un metodo EJB un'operazione che richiede all'interno di una transazione distribuita che è stato eseguito il rollback a causa l'eccezione.

Altri suggerimenti

La causa del problema dovrebbe essere disponibile nel registro del server dei domini che ospitano l'EJB che ha avuto un problema.

Sembra sempre più informazioni di ritorno da l'altra estremità può essere difficile ... non so che issue tracker sarebbe quello giusto per le informazioni perse quando viene creato l'ApplicationException / gettato.

Un hack totale sarebbe di creare un insieme di classi di eccezioni personalizzate nel progetto che ha l'EJB che non è riuscito. Si potrebbe renderli molto a grana fine di coprire le probabili cause del problema e di fornire dettagli sufficienti nel loro nome per identificare la posizione attuale del problema, anche. Schifo ... ma che può essere l'unica scelta fino a quando un problema viene depositato e la correzione viene distribuito.

  

C'è qualcosa che posso fare qui per   conservare le informazioni circa l'effettiva   causa del problema?

Purtroppo, no. ORB non utilizza normale serializzazione oggetto per eccezioni di sistema (cioè, org.omg.CORBA. *), I quali mezzi che le cause sono persi. Come @vkraemer Detto questo, è necessario fare affidamento su log del server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top