-
1. Re: Problems with setRollbackOnly
peejay Sep 20, 2003 4:22 AM (in response to peejay)Maybe i found the solution for this behavoir.
The doSomething method (see above) was called from
the doSomeOtherThings method within the same bean A.
/**
* @ejb.interface-method
* @ejb.transaction type="NotSupported"
*/
public void doSomeOtherThings(...) {
...
doSomething(...);
...
}
Can this cause the behavior (described above) of setRollbackOnly()?
I think so because when i call the doSomething method from another bean B the method writes out rollback = true and the rollback is executed.
Can somebody explain that to me? Is it impossible to call a method with another transaction attribut which is within the same bean instance?
When the rollback is performed a TransactionRolledbackLocalException is throw from the doSomething method of bean A and the remove method of bean A is called.
I want to call the doSomething method serveral times.
So do i have to catch the TransactionRolledbackLocalException in bean B then or is there another way?
Bean B:
**
* @ejb.interface-method
* @ejb.transaction type="NotSupported"
*/
public void callDoSomething(...) {
...
while (...)
try {
doSomething(...);
} catch (TransactionRolledbackLocalException e) {
do nothing...
}
...
}
Thanks in advance again
peejay -
2. Re: Problems with setRollbackOnly
peejay Sep 21, 2003 7:52 AM (in response to peejay)I have another problem with setRollbackOnly.
I want to perform a bank transfer. And if something goes wrong I want to send a message to a queue and i want to rollback the transaction.
I have a SLSB TransferHandler and another SLSB Sender which sends a message to a queue.
The processTransfer method of the TransferHandler:
Version 1:
/**
* @ejb.interface-method
* @ejb.transaction type="Required"
*/
public void processTransfer(...) {
try {
...doSomething...
} catch (AFailureException e) {
context.setRollbackOnly();
...
lookup Sender
...
senderLocal.sendMessageToQueue();
}
}
The sendMessageToQueue method of the Sender:
/**
* @ejb.interface-method
* @ejb.transaction type="NotSupported"
*/
public void sendMessageToQueue(...) {
...
sends a message to a queue
...
}
If i run my application and an exception occures within processTransfer method version 1 the sendMessageToQueue method of Sender isnt called and a TransactionRolledbackLocalException is thrown.
Why is the sendMessageToQueue method not called?
I thought that the transaction is rolled back at the end of the transaction what in my case is the end of the processTransfer method.
Then I changed the processTransfer method
Version 2:
/**
* @ejb.interface-method
* @ejb.transaction type="Required"
*/
public void processTransfer(...) {
try {
...doSomething...
} catch (AFailureException e) {
...
lookup Sender
...
senderLocal.sendMessageToQueue();
context.setRollbackOnly();
}
}
Now the sendMessageToQueue method is called. But the processTransfers() doesnt throw a TransactionRolledbackLocalException. Why not?
Any ideas?
Thanks
peejay