@Override public void registerSynchronization(Synchronization synchronization) throws RollbackException, IllegalStateException, SystemException { if (status == Status.STATUS_NO_TRANSACTION) throw new IllegalStateException("transaction hasn't started yet"); if (status == Status.STATUS_MARKED_ROLLBACK) throw new BitronixRollbackException("transaction has been marked as rollback only"); if (isDone()) throw new IllegalStateException("transaction is done, cannot register any more synchronization"); if (log.isDebugEnabled()) { log.debug("registering synchronization " + synchronization); } synchronizationScheduler.add(synchronization, Scheduler.DEFAULT_POSITION); }
public List<XAResourceHolderState> getAllResources() { List<XAResourceHolderState> result = new ArrayList<XAResourceHolderState>(resources.size()); for (Integer positionKey : resources.getNaturalOrderPositions()) { result.addAll(resources.getByNaturalOrderForPosition(positionKey)); } return Collections.unmodifiableList(result); }
public List<XAResourceHolderState> getReverseOrderResourcesForPosition(Integer position) { return Collections.unmodifiableList(resources.getByReverseOrderForPosition(position)); }
@Override public String toString() { return "a Scheduler with " + size() + " object(s) in " + getNaturalOrderPositions().size() + " position(s)"; }
public void testNaturalOrdering() throws Exception { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition()); assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString()); assertEquals(5, resourceScheduler.size()); Set<Integer> priorities = resourceScheduler.getNaturalOrderPositions(); assertEquals(3, priorities.size()); List<XAResourceHolderState> list0 = resourceScheduler.getByNaturalOrderForPosition(key0); assertEquals(1, list0.size()); assertTrue(xarhs3 == list0.get(0)); List<XAResourceHolderState> list1 = resourceScheduler.getByNaturalOrderForPosition(key1); assertEquals(3, list1.size()); assertTrue(xarhs0 == list1.get(0)); List<XAResourceHolderState> list2 = resourceScheduler.getByNaturalOrderForPosition(key2); assertEquals(1, list2.size()); assertTrue(xarhs4 == list2.get(0));
List<XAResourceHolderState> alwaysLastResources = resources.getByNaturalOrderForPosition(Scheduler.ALWAYS_LAST_POSITION); if (alwaysLastResources != null && !alwaysLastResources.isEmpty()) throw new BitronixSystemException("cannot enlist more than one non-XA resource, tried enlisting " + xaResourceHolderState + ", already enlisted: " + alwaysLastResources.get(0)); resources.remove(toBeJoinedHolderState); resources.add(xaResourceHolderState, xaResourceHolderState.getTwoPcOrderingPosition());
public void testReverseOrdering() throws Exception { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition()); assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString()); Set<Integer> reverseOrderPriorities = resourceScheduler.getReverseOrderPositions(); assertEquals(3, reverseOrderPriorities.size()); assertFalse(itReverse.hasNext()); List<XAResourceHolderState> list0r = resourceScheduler.getByReverseOrderForPosition(key0r); assertEquals(1, list0r.size()); assertTrue(xarhs4 == list0r.get(0)); List<XAResourceHolderState> list1r = resourceScheduler.getByReverseOrderForPosition(key1r); assertEquals(3, list1r.size()); assertTrue(xarhs2 == list1r.get(0)); List<XAResourceHolderState> list2r = resourceScheduler.getByReverseOrderForPosition(key2r); assertEquals(1, list2r.size()); assertTrue(xarhs3 == list2r.get(0));
public void testIterator() { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition()); assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString()); Iterator<XAResourceHolderState> it = resourceScheduler.iterator(); assertTrue(it.hasNext()); assertTrue(xarhs3 == it.next()); assertFalse(it.hasNext()); it = resourceScheduler.iterator(); assertTrue(it.hasNext()); assertTrue(xarhs3 == it.next()); it.remove(); assertFalse(it.hasNext()); assertEquals(0, resourceScheduler.size());
public void testReverseRemove() { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0)); XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.remove(xarhs0); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); Iterator<XAResourceHolderState> it = resourceScheduler.reverseIterator(); assertTrue(it.hasNext()); assertTrue(xarhs1 == it.next()); it.remove(); assertTrue(xarhs0 == it.next()); it.remove(); }
public void testRemove() { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0)); XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.remove(xarhs0); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); Iterator<XAResourceHolderState> it = resourceScheduler.iterator(); assertTrue(it.hasNext()); assertTrue(xarhs0 == it.next()); it.remove(); assertTrue(xarhs1 == it.next()); it.remove(); }
/** * Remove this transaction's {@link XAResourceHolderState} from all enlisted * {@link bitronix.tm.resource.common.XAResourceHolder}s. */ public void clearXAResourceHolderStates() { if (log.isDebugEnabled()) log.debug("clearing XAResourceHolder states on " + resources.size() + " resource(s)"); Iterator<XAResourceHolderState> it = resources.iterator(); while (it.hasNext()) { XAResourceHolderState xaResourceHolderState = it.next(); XAResourceHolder resourceHolder = xaResourceHolderState.getXAResourceHolder(); // clear out the current state resourceHolder.removeXAResourceHolderState(xaResourceHolderState.getXid()); Map statesForGtrid = resourceHolder.getXAResourceHolderStatesForGtrid(gtrid); if (statesForGtrid != null) log.warn("resource " + resourceHolder + " did not clean up " + statesForGtrid.size() + "transaction states for GTRID [" + gtrid + "]"); else if (log.isDebugEnabled()) log.debug("resource " + resourceHolder + " cleaned up all transaction states for GTRID [" + gtrid + "]"); it.remove(); } }
/** * Run all registered Synchronizations' beforeCompletion() method. Be aware that this method can change the * transaction status to mark it as rollback only for instance. * @throws bitronix.tm.internal.BitronixSystemException if status changing due to a synchronization throwing an * exception fails. */ private void fireBeforeCompletionEvent() throws BitronixSystemException { if (log.isDebugEnabled()) { log.debug("before completion, " + synchronizationScheduler.size() + " synchronization(s) to execute"); } Iterator<Synchronization> it = synchronizationScheduler.reverseIterator(); while (it.hasNext()) { Synchronization synchronization = it.next(); try { if (log.isDebugEnabled()) { log.debug("executing synchronization " + synchronization); } synchronization.beforeCompletion(); } catch (RuntimeException ex) { if (log.isDebugEnabled()) { log.debug("Synchronization.beforeCompletion() call failed for " + synchronization + ", marking transaction as rollback only - " + ex); } setStatus(Status.STATUS_MARKED_ROLLBACK); throw ex; } } }
public void testReverseIterator() { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(1)); XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1)); XAResourceHolderState xarhs2 = new XAResourceHolderState(null, new MockResourceBean(1)); XAResourceHolderState xarhs3 = new XAResourceHolderState(null, new MockResourceBean(0)); XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition()); assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString()); Iterator it = resourceScheduler.reverseIterator(); assertTrue(it.hasNext()); assertTrue(xarhs4 == it.next()); assertTrue(xarhs0 == it.next()); assertTrue(xarhs1 == it.next()); assertTrue(xarhs2 == it.next()); assertTrue(xarhs3 == it.next()); assertFalse(it.hasNext()); }
/** * Get the enlisted resources count. * @return the enlisted resources count. */ public int size() { return resources.size(); }
public void testHasNext() { Scheduler<XAResourceHolderState> resourceScheduler = new Scheduler<XAResourceHolderState>(); XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0)); XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(10)); resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition()); resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition()); Iterator<XAResourceHolderState> it = resourceScheduler.iterator(); for (int i=0; i<10 ;i++) { assertTrue(it.hasNext()); } it.next(); for (int i=0; i<10 ;i++) { assertTrue(it.hasNext()); } it.next(); for (int i=0; i<10 ;i++) { assertFalse(it.hasNext()); } try { it.next(); fail("expected NoSuchElementException"); } catch (NoSuchElementException ex) { // expected } }
public SortedSet<Integer> getNaturalOrderPositions() { return Collections.unmodifiableSortedSet(resources.getNaturalOrderPositions()); }
public List<XAResourceHolderState> getNaturalOrderResourcesForPosition(Integer position) { return Collections.unmodifiableList(resources.getByNaturalOrderForPosition(position)); }
public synchronized void remove(T obj) { Iterator<T> it = iterator(); while (it.hasNext()) { T o = it.next(); if (o == obj) { it.remove(); return; } } throw new NoSuchElementException("no such element: " + obj); }
public SortedSet<Integer> getReverseOrderPositions() { return Collections.unmodifiableSortedSet(resources.getReverseOrderPositions()); }
/** * Ensure the {@link XAStatefulHolder}'s release won't be deferred anymore (when appropriate) as it has been recycled. * @param xaStatefulHolder the recycled {@link XAStatefulHolder}. */ public static void recycle(XAStatefulHolder<? extends XAStatefulHolder> xaStatefulHolder) { BitronixTransaction currentTransaction = currentTransaction(); if (log.isDebugEnabled()) { log.debug("marking " + xaStatefulHolder + " as recycled in " + currentTransaction); } Scheduler<Synchronization> synchronizationScheduler = currentTransaction.getSynchronizationScheduler(); DeferredReleaseSynchronization deferredReleaseSynchronization = findDeferredRelease(xaStatefulHolder, currentTransaction); if (deferredReleaseSynchronization != null) { if (log.isDebugEnabled()) { log.debug(xaStatefulHolder + " has been recycled, unregistering deferred release from " + currentTransaction); } synchronizationScheduler.remove(deferredReleaseSynchronization); } }