final SomeBean anotherTemplate = new SomeBean();
anotherTemplate.name = "another bean";
final long timeout = 1000 * 2;
final TransactionTemplate notSupportedTransaction = new TransactionTemplate(
txTemplate.getTransactionManager());
notSupportedTransaction.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
notSupportedTransaction.afterPropertiesSet();
final TransactionTemplate mandatoryTransaction = new TransactionTemplate(txTemplate.getTransactionManager());
mandatoryTransaction.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
mandatoryTransaction.afterPropertiesSet();
final RuntimeException EXCEPTION = new RuntimeException("intentional exception");
try {
// start tx (REQUIRED)
txTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(final TransactionStatus status) {
spaceTemplate.execute(new JavaSpaceCallback() {
public Object doInSpace(JavaSpace js, final Transaction transaction)
throws RemoteException, TransactionException, UnusableEntryException,
InterruptedException {
// check that we have a tx
assertNotNull("no tx started", transaction);
Object result = js.read(template, transaction, timeout);
assertNull(result);
// write
js.write(template, transaction, Lease.ANY);
notSupportedTransaction.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(final TransactionStatus status2) {
spaceTemplate.execute(new JavaSpaceCallback() {
public Object doInSpace(JavaSpace js2, Transaction transaction2)
throws RemoteException, TransactionException,
UnusableEntryException, InterruptedException {
// NOT_SUPPORTED means tx was suspended
assertNull(transaction2);
assertSame(transaction2, JiniUtils.getTransaction(space));
js2.write(anotherTemplate, transaction2, Lease.ANY);
// check object from
// find the object in the parent transaction
Object rez = js2.read(template, transaction, timeout);
assertNotNull(rez);
// but not in child transaction (NOT_SUPPORTED)
rez = js2.read(template, transaction2, timeout);
assertNull(rez);
rez = js2.read(anotherTemplate, transaction2, timeout);
assertNotNull(rez);
return null;
}
});
}
});
// find the template
result = js.read(template, transaction, timeout);
assertNotNull(result);
result = js.read(anotherTemplate, transaction, timeout);
assertNotNull(result);
return mandatoryTransaction.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
Transaction tx = JiniUtils.getTransaction(space);
assertSame(transaction ,tx);
assertNotNull(spaceTemplate.readIfExists(template,timeout));
throw EXCEPTION;