
com.gruelbox.transactionoutbox.spi.AbstractThreadLocalTransactionManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of transactionoutbox-core Show documentation
Show all versions of transactionoutbox-core Show documentation
A safe implementation of the transactional outbox pattern for Java (core library)
package com.gruelbox.transactionoutbox.spi;
import 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)
public 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));
}
public final TX pushTransaction(TX transaction) {
transactions.get().push(transaction);
return transaction;
}
public final TX popTransaction() {
TX result = transactions.get().pop();
if (transactions.get().isEmpty()) {
transactions.remove();
}
return result;
}
public Optional peekTransaction() {
return Optional.ofNullable(transactions.get().peek());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy