com.gruelbox.transactionoutbox.AbstractThreadLocalTransactionManager Maven / Gradle / Ivy
package com.gruelbox.transactionoutbox;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Optional;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
abstract class AbstractThreadLocalTransactionManager
implements ThreadLocalContextTransactionManager {
private final ThreadLocal> transactions = ThreadLocal.withInitial(LinkedList::new);
@Override
public final void inTransaction(Runnable runnable) {
ThreadLocalContextTransactionManager.super.inTransaction(runnable);
}
@Override
public final void inTransaction(TransactionalWork work) {
ThreadLocalContextTransactionManager.super.inTransaction(work);
}
@Override
public final T inTransactionReturns(TransactionalSupplier supplier) {
return ThreadLocalContextTransactionManager.super.inTransactionReturns(supplier);
}
@Override
public final void inTransactionThrows(ThrowingTransactionalWork work)
throws E {
ThreadLocalContextTransactionManager.super.inTransactionThrows(work);
}
@Override
public T requireTransactionReturns(
ThrowingTransactionalSupplier work) throws E, NoTransactionActiveException {
return work.doWork(peekTransaction().orElseThrow(NoTransactionActiveException::new));
}
final TX pushTransaction(TX transaction) {
transactions.get().push(transaction);
return transaction;
}
final TX popTransaction() {
TX result = transactions.get().pop();
if (transactions.get().isEmpty()) {
transactions.remove();
}
return result;
}
Optional peekTransaction() {
return Optional.ofNullable(transactions.get().peek());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy