public class OsgiJtaPlatform implements JtaPlatform {
private final long serviceTimeOutMilliseconds = TimeUnit.SECONDS.toMillis(1);
private static final long serialVersionUID = 1L;
private final ServiceTracker<TransactionManager, TransactionManager> transactionManagerServiceTracker;
private final ServiceTracker<UserTransaction, UserTransaction> userTransactionServiceTracker;
public OsgiJtaPlatform(BundleContext bundleContext) {
transactionManagerServiceTracker = new ServiceTracker<TransactionManager, TransactionManager>(bundleContext, TransactionManager.class, null);
userTransactionServiceTracker = new ServiceTracker<UserTransaction, UserTransaction>(bundleContext, UserTransaction.class, null);
}
/**
* shut down this Platform (call e.g. in activators stop method)
*/
public void shutdown() {
transactionManagerServiceTracker.close();
userTransactionServiceTracker.close();
}
@Override
public TransactionManager retrieveTransactionManager() {
try {
TransactionManager service = transactionManagerServiceTracker.waitForService(serviceTimeOutMilliseconds);
if (service != null) {
return service;
}
} catch (InterruptedException e) {
throw new TransactionException("Operation was interrupted");
}
throw new TransactionException("Can't fetch TransactionManager service within specified timeout");
}
@Override
public UserTransaction retrieveUserTransaction() {
try {
UserTransaction service = userTransactionServiceTracker.waitForService(serviceTimeOutMilliseconds);
if (service != null) {
return service;
}
} catch (InterruptedException e) {
throw new TransactionException("Operation was interrupted");
}
throw new TransactionException("Can't fetch UserTransaction service within specified timeout");
}
....
}