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) {