# Problem mit Java Transaction API



## thisis (11. Sep 2008)

Hallo zusammen,

ich versuche seit geraumer Zeit mit Hilfe der JTA eine kleine Applikation zu programmieren. 

Als Beispiel versuche ich mich gerade an einer Reisebuchung.
Hierfür hab ich nun 3 Webservices (Auto/Hotel/Flug) die für je eine Buchung stehen. Über einen vierten Webservice (Reservierung), der extern läuft frage ich nun ein beliebiges Datum ab. Bestätigen mir die 3 Webservices nun alle das Datum, führe ich einen Commit aus damit die Reise gebucht wird. Kann ein Webservice dieses Datum nicht bestätigen wird ein Rollback durchgeführt.

Mein Problem ist, dass keine richtige Transaktion zustande kommt. Über die Statusabfrage erhalte die Ausgabe das meine Transaktion aktiv ist oder das keine Transaktion vorhanden ist. Ich sehe jedoch nirgends ob commited/rollbacked wurde.


Hier der externe Webservice


```
@TransactionManagement(TransactionManagementType.BEAN)
@WebService()
@Stateless
public class ReservierungWeb {
    
    @WebServiceRef(wsdlLocation = "http://localhost:8080/HotelWebService/HotelWeb?wsdl")
    private HotelWebService service3;
    @WebServiceRef(wsdlLocation = "http://localhost:8080/FlugWebService/FlugWeb?wsdl")
    private FlugWebService service2;
    @WebServiceRef(wsdlLocation = "http://localhost:8080/AutoWebService/AutoWeb?wsdl")
    private AutoWebService service1;

    @WebMethod
    public void checkReise(int date) throws Exception {

        Context ctx = new InitialContext();
        UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");

        utx.begin();
        try { // Call Web Service Operation

            printTxStatus(utx.getStatus());
            de.hdm.auto.AutoWeb portAuto = service1.getAutoWebPort();
            // TODO initialize WS operation arguments here
            // TODO process result here
            int resultAuto = portAuto.checkDateAuto(date);

            if (resultAuto == date) {
                System.out.println("Autoreservierung möglich am: " + resultAuto);
            } else {
                System.out.println("Mietauto zu diesem Zeitpunkt nicht verfügbar");
            }

            de.hdm.flug.FlugWeb portFlug = service2.getFlugWebPort();
            // TODO initialize WS operation arguments here
            // TODO process result here
            int resultFlug = portFlug.checkDateFlug(date);
            if (resultFlug == date) {
                System.out.println("Flugreservierung möglich am: " + resultFlug);
            } else {
                System.out.println("Flug zu diesem Zeitpunkt nicht möglich");
            }


            de.hdm.hotel.HotelWeb portHotel = service3.getHotelWebPort();
            // TODO initialize WS operation arguments here
            // TODO process result here
            int resultHotel = portHotel.checkDateHotel(date);
            if (resultHotel == date) {

                System.out.println("Hotelreservierung möglich am: " + resultHotel);
            } else {
                System.out.println("Hotel zu diesem Zeitpunkt nicht verfügbar");
            }

            if (resultAuto == date && resultFlug == date && resultHotel == date) {

                
                
                
                utx.commit();
                System.out.println("Reise wurde gebucht!!");                

            } else {

                // utx.setRollbackOnly();               

                System.out.println("Reise zu diesem Datum nicht möglich! Bitte geben Sie ein anderes Reisedatum ein!");
            }            
        } catch (Exception ex) {
            utx.rollback();
            System.out.println("Fehler aufgetreten!");
            throw new EJBException("beenden der Transaktion", ex);
        }
    }
    
    private static void printTxStatus(int status) {
        switch (status) {
            case Status.STATUS_ACTIVE:
                System.out.println("***Tx Satus\t: STATUS_ACTIVE");
                break;
            case Status.STATUS_COMMITTED:
                System.out.println("***Tx Satus\t: STATUS_COMMITTED");
                break;
            case Status.STATUS_NO_TRANSACTION:
                System.out.println("***Tx Satus\t: STATUS_NO_TRANSACTION");
                break;
            case Status.STATUS_MARKED_ROLLBACK:
                System.out.println("***Tx Satus\t: STATUS_ROLLEDBACK");
                break;
            case Status.STATUS_UNKNOWN:
                System.out.println("***Tx Satus\t: STATUS_UNKNOWN");
                break;
            case Status.STATUS_COMMITTING:
                System.out.println("***Tx Satus\t: STATUS_COMMITTING");
                break;
            case Status.STATUS_PREPARING:
                System.out.println("***Tx Satus\t: STATUS_PREPARING");
                break;
            case Status.STATUS_ROLLING_BACK:
                System.out.println("***TX Satus\t: STATUS_ROLLING_BACK");
                break;
        }
    }


}
```


Hier einer der drei Auto/Hotel/Flug (alle identisch aufgebaut)


```
@WebService()
@Stateless()
public class AutoWeb {

    private int date = 19122008;
   
   
    @WebMethod
    public int checkDateAuto(int date) {
      if ( this.date != date ) {
         
            return 1;
        }
        return this.date;
    }
    
    
    
}
```

Hoffentlich versteht jemand mein Problem und kann mir dabei helfen.
Danke schonmal im voraus.

Lg
thisis[/code]


----------



## Guest (13. Sep 2008)

```
utx.begin();
```
fehlt.  :bae:  

Das ganze würde ich auch noch überarbeiten. Wenn checkDateAuto negativ ausfällt, dann kannst du dir 
die restliche Prüfung sparen. Ausserden, wie gelangt diese Information nach Aussen? OK... weitermachen.


----------



## FArt (13. Sep 2008)

@Gast
utx.begin() steht in Zeile 20

Wo wird denn hier in eine DB geschrieben? Wie wird der Zugriff auf die anderen Services realisiert?
Wenn alle Services an einer Transaktion teilnehmen sollen, wie wird diese propagiert?
Je nach Server kann es sein, dass (auch wenn alle Services in einer VM laufen und auf die gleiche Datasource zugreifen) mit XA Transaktionen konfiguriert sein müssen.

Schalte das Logging für deinen Server so ein, dass du viele Informationen über die Transaktion bekommst.


----------

