You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/01/14 11:06:04 UTC
[isis] branch master updated: ISIS-2479: implements transaction
sequence tracking (not tested yet)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 6181ff4 ISIS-2479: implements transaction sequence tracking (not tested yet)
6181ff4 is described below
commit 6181ff4976ff7c1eb7185901f07060a76333074b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 14 12:05:51 2021 +0100
ISIS-2479: implements transaction sequence tracking (not tested yet)
---
.../transaction/TransactionServiceSpring.java | 41 ++++++++++++++++++++--
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/transaction/TransactionServiceSpring.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/transaction/TransactionServiceSpring.java
index 293b8e2..d4752e4 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/transaction/TransactionServiceSpring.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/transaction/TransactionServiceSpring.java
@@ -21,12 +21,14 @@ package org.apache.isis.core.runtimeservices.transaction;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.LongAdder;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
+import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
@@ -42,18 +44,32 @@ import org.apache.isis.applib.services.xactn.TransactionState;
import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.functional.Result;
import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.interaction.scope.InteractionScopeAware;
+import org.apache.isis.core.interaction.session.InteractionSession;
import org.apache.isis.core.interaction.session.InteractionTracker;
+import org.apache.isis.core.transaction.events.TransactionAfterCompletionEvent;
import lombok.val;
import lombok.extern.log4j.Log4j2;
+/**
+ * @implNote This implementation yet does not support more than one {@link PlatformTransactionManager}
+ * on the same Spring context. If more than one are discovered, some methods will fail
+ * with {@link IllegalStateException}s.
+ *
+ * @since 2.0 {@index}
+ *
+ */
@Service
@Named("isisRuntimeServices.TransactionServiceSpring")
@Order(OrderPrecedence.MIDPOINT)
@Primary
@Qualifier("Spring")
@Log4j2
-public class TransactionServiceSpring implements TransactionService {
+public class TransactionServiceSpring
+implements
+ TransactionService,
+ InteractionScopeAware {
private final Can<PlatformTransactionManager> platformTransactionManagers;
private final InteractionTracker interactionTracker;
@@ -121,10 +137,15 @@ public class TransactionServiceSpring implements TransactionService {
.ifPresent(TransactionStatus::flush);
}
+
@Override
public Optional<TransactionId> currentTransactionId() {
return interactionTracker.getConversationId()
- .map(uuid->TransactionId.of(uuid, 0, "")); //TODO track tx completion-counts
+ .map(uuid->{
+ //XXX get current transaction's persistence context (once we support multiple contexts)
+ val persistenceContext = "";
+ return TransactionId.of(uuid, txCounter.get().intValue(), persistenceContext);
+ });
}
@Override
@@ -147,6 +168,22 @@ public class TransactionServiceSpring implements TransactionService {
.orElse(TransactionState.NONE);
}
+ // -- TRANSACTION SEQUENCE TRACKING
+
+ private ThreadLocal<LongAdder> txCounter = ThreadLocal.withInitial(LongAdder::new);
+
+ /** INTERACTION BEGIN BOUNDARY */
+ @Override
+ public void beforeEnteringTransactionalBoundary(InteractionSession interactionSession) {
+ txCounter.get().reset();
+ }
+
+ /** TRANSACTION END BOUNDARY */
+ @EventListener(TransactionAfterCompletionEvent.class)
+ public void onTransactionEnded(TransactionAfterCompletionEvent event) {
+ txCounter.get().increment();
+ }
+
// -- HELPER
private PlatformTransactionManager transactionManagerForElseFail(TransactionDefinition def) {