use of javax.resource.spi.work.WorkCompletedException in project narayana by jbosstm.
the class XATerminator method registerWork.
/**
* Register the unit of work with the specified transaction. The
* thread-to-transaction association is not changed yet. Basically this
* operation only lets the transaction system know about the work and
* nothing else.
*
* @param work
* the work to associate with the transaction.
* @param xid
* the transaction within which the work will be performed.
* @param timeout
* the lifetime of the transaction.
*
* @throws WorkCompletedException
* thrown if the work cannot be associated with the transactin.
*/
public void registerWork(Work work, Xid xid, long timeout) throws WorkCompletedException {
try {
/*
* Remember to convert timeout to seconds.
*/
Transaction tx = SubordinationManager.getTransactionImporter().importTransaction(xid, (int) timeout / 1000);
switch(tx.getStatus()) {
case Status.STATUS_NO_TRANSACTION:
case Status.STATUS_UNKNOWN:
throw new WorkCompletedException(jbossatxLogger.i18NLogger.get_jts_jca_inactive(), WorkException.TX_RECREATE_FAILED);
case Status.STATUS_ACTIVE:
break;
default:
throw new WorkCompletedException(jbossatxLogger.i18NLogger.get_jts_jca_completing(), WorkException.TX_CONCURRENT_WORK_DISALLOWED);
}
TxWorkManager.addWork(work, tx);
/*
* TODO currently means one synchronization per work item and that
* instance isn't removed when/if the work item is cancelled and
* another work item is later added.
*
* Synchronizations are pretty lightweight and this add/remove/add
* scenario will hopefully not happen that much. So, we don't
* optimise for it at the moment. Re-evaluate if it does become an
* overhead.
*/
tx.registerSynchronization(new WorkSynchronization(tx));
} catch (WorkCompletedException ex) {
throw ex;
} catch (XAException ex) {
throw new WorkCompletedException(ex);
} catch (Exception ex) {
ex.printStackTrace();
throw new WorkCompletedException(jbossatxLogger.i18NLogger.get_jts_jca_unknown(), WorkException.INTERNAL);
}
}
use of javax.resource.spi.work.WorkCompletedException in project narayana by jbosstm.
the class TxWorkManager method addWork.
/*
* Although we allow multiple units of work per transaction, currently
* JCA only allows one. Might not be worth the hassle of maintaining this
* support.
*/
/**
* Add the specified work unit to the specified transaction.
*
* @param work The work to associate with the transaction.
* @param tx The transaction to have associated with the work.
*
* @throws WorkCompletedException thrown if there is already work
* associated with the transaction.
*/
public static void addWork(Work work, Transaction tx) throws WorkCompletedException {
Stack<Work> workers;
synchronized (_transactions) {
workers = _transactions.get(tx);
if (workers == null) {
workers = new Stack<Work>();
_transactions.put(tx, workers);
} else
throw new WorkCompletedException(jtaxLogger.i18NLogger.get_jtax_transaction_jts_jca_busy(), WorkException.TX_CONCURRENT_WORK_DISALLOWED);
}
synchronized (workers) {
workers.push(work);
}
}
Aggregations