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
Hier einer der drei Auto/Hotel/Flug (alle identisch aufgebaut)
Hoffentlich versteht jemand mein Problem und kann mir dabei helfen.
Danke schonmal im voraus.
Lg
thisis[/code]
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
Code:
@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)
Code:
@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]