Propagarea tranzacţiei nu este suportată pentru interfeţele la distanţă EJB (Enterprise JavaBeans)

Liberty nu suportă propagarea tranzacţiei de intrare sau de ieşire pentru interfeţe la distanţă EJB. Implicit, bean-urile EJB sunt gestionate de container şi utilizează atributul de tranzacţie Required. Ca rezultat, definiţiile EJB existente care nu specifică nicio proprietate container-transaction sunt configurate implicit pentru a utiliza tranzacţii, deşi nu sunt suportate.

Această regulă semnalează codul Java care face referire la următoarele adnotări EJB care indică utilizarea interfeţelor la distanţă sau interfeţelor home:

Această regulă, de asemenea, semnalează următoarele referinţe în fişierul ejb-jar.xml:

Specificaţia EJB necesită produse care suportă propagarea tranzacţiei de ieşire pentru a trimite în continuare un context de tranzacţie null. Acest context trebuie să fie refuzat de componentele EJB care utilizează atributele de tranzacţie Required (implicit), Mandatory sau Supports. Un client cu o tranzacţie globală activă nu poate porni un bean EJB cu atributele de tranzacţie implicită dacă fie clientul, fie serverul este pe Liberty.

Pentru a activa clientul să pornească bean-ul EJB, modificaţi bean-ul EJB pentru a utiliza atributul de tranzacţie RequiresNew sau NotSupported. Deşi aceste atribute vor permite bean-ului EJB să pornească, lucrul tranzacţional care este făcut de bean-ul EJB nu este comis ca parte a tranzacţiilor client.

Reţineţi că propagarea tranzacţiei este suportată pentru interfeţele la distanţă EJB care rulează în acelaşi JVM, dar acest lucru poate fi determinat doar cu o investigare suplimentară a comportamentului aplicaţiei.

Asiguraţi-vă că interfeţele EJB la distanţă sunt necesare

Adesea bean-urile EJB 2.x configurează interfeţele la distanţă în ejb-jar.xml chiar şi atunci când nu sunt utilizate. Aveţi nevoie de interfeţe la distanţă doar dacă aveţi cod care rulează peste două JVM-uri diferite. În termeni WebSphere, aceasta este fie între două servere de aplicaţii diferite, fie între o aplicaţie client şi un server de aplicaţii care rulează în JVM-uri diferite. Informaţiile CORBA, cum ar fi un URL de furnizor iiop://, într-o căutare EJB este de asemenea un indicator că sunt folosite bean-uri EJB la distanţă.

Dacă faceţi referire la bean-uri EJB care utilizează o interfaţă la distanţă care rulează în acelaşi JVM, interfaţa Local poate fi folosită şi va performa mai bine. Acolo unde este posibil, modificaţi adnotările de la @Remote la @Local şi de la @RemoteHome la @LocalHome şi testaţi toate scenariile codului dumneavoastră. De asemenea, pentru configuraţia ejb-jar.xml, înlăturaţi definiţiile <remote/> şi <business-remote/> şi testaţi toate scenariile. În timp ce propagarea tranzacţiei este suportată pentru acest scenariu, cea mai bună practică este convertirea la utilizarea de interfeţe locale pentru a îmbunătăţi performanţa şi a înlătura percepţia că metodele pot fi apelate extern de la acelaşi JVM.

Dacă aveţi nevoie cu adevărat de interfeţe la distanţă

Înfăşuraţi bean-urile EJB într-un serviciu web (JAX-WS)

Pentru acele bean-uri EJB care necesită acces la distanţă, cea mai bună practică este să le înfăşuraţi într-un serviciu web. Consultaţi Annotating an EJB bean to create a web service pentru instrucţiuni pentru utilizarea WebSphere Application Server Developer Tools for Eclipse pentru a face aceste modificări de cod. După înfăşurarea bean-urilor EJB în servicii web, utilizaţi clientul de servicii web pentru a apela serviciul web EJB. După testare, puteţi înlătura adnotările la distanţă EJB sau configuraţia.

Tratarea propagării tranzacţiei
Liberty furnizează suport WS-AT (Web Services Atomic Transaction) care activează tranzacţiile globale distribuite. Când EJB-ul dumneavoastră este implementat ca servicii web, WS-AT poate fi folosit pentru a gestiona tranzacţiile. Pentru informaţii suplimentare, vedeţi Web Services Atomic Transaction overview.

Pentru mai multe informaţii despre subiectele înrudite, vedeţi