This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit a7b942156e41e2bc55cb7578fe745b621b57334d
Author: seanyinx <sean....@huawei.com>
AuthorDate: Sat Dec 23 10:39:59 2017 +0800

    SCB-96 added post transaction interception
    
    Signed-off-by: seanyinx <sean....@huawei.com>
---
 .../spring/TransactionInterceptionTest.java        | 40 ++++++++++++-----
 ...dEvent.java => PostTransactionInterceptor.java} | 14 +++---
 .../saga/omega/transaction/TransactionAspect.java  | 17 +++++++-
 .../{TxStartedEvent.java => TxEndedEvent.java}     | 12 ++----
 .../saga/omega/transaction/TxEvent.java            |  6 ++-
 .../saga/omega/transaction/TxStartedEvent.java     |  5 ---
 .../PostTransactionInterceptorTest.java            | 50 ++++++++++++++++++++++
 7 files changed, 110 insertions(+), 34 deletions(-)

diff --git 
a/omega/omega-spring-tx/src/test/java/io/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
 
b/omega/omega-spring-tx/src/test/java/io/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
index c94a4cb..0c4fbab 100644
--- 
a/omega/omega-spring-tx/src/test/java/io/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
+++ 
b/omega/omega-spring-tx/src/test/java/io/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
@@ -18,12 +18,13 @@
 package io.servicecomb.saga.omega.transaction.spring;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
-import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
-import static org.junit.Assert.assertThat;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -42,6 +43,8 @@ import 
io.servicecomb.saga.omega.transaction.spring.TransactionInterceptionTest.
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TransactionTestMain.class, MessageConfig.class})
 public class TransactionInterceptionTest {
+  private static final String TX_STARTED_EVENT = "TxStartedEvent";
+  private static final String TX_ENDED_EVENT = "TxEndedEvent";
   private final String globalTxId = UUID.randomUUID().toString();
   private final String localTxId = UUID.randomUUID().toString();
   private final String parentTxId = UUID.randomUUID().toString();
@@ -68,7 +71,18 @@ public class TransactionInterceptionTest {
   public void sendsUserToRemote_BeforeTransaction() throws Exception {
     userService.add(new User(username, email));
 
-    assertThat(messages, contains(serialize(globalTxId, localTxId, parentTxId, 
"TxStartedEvent", username, email)));
+    assertEquals(
+        asList(
+            txStartedEvent(globalTxId, localTxId, parentTxId, username, email),
+            txEndedEvent(globalTxId, localTxId, parentTxId)),
+        toString(messages)
+    );
+  }
+
+  private List<String> toString(List<byte[]> messages) {
+    return messages.stream()
+        .map(String::new)
+        .collect(Collectors.toList());
   }
 
   @Configuration
@@ -88,26 +102,30 @@ public class TransactionInterceptionTest {
     @Bean
     MessageSerializer serializer() {
       return event -> {
-        if (event.payloads()[0] instanceof User) {
+        if (TX_STARTED_EVENT.equals(event.type())) {
           User user = ((User) event.payloads()[0]);
-          return serialize(event.globalTxId(),
+          return txStartedEvent(event.globalTxId(),
               event.localTxId(),
               event.parentTxId(),
-              event.type(),
               user.username(),
-              user.email());
+              user.email()).getBytes();
         }
-        throw new IllegalArgumentException("Expected instance of User, but was 
" + event.getClass());
+        return txEndedEvent(event.globalTxId(),
+            event.localTxId(),
+            event.parentTxId()).getBytes();
       };
     }
   }
 
-  private static byte[] serialize(String globalTxId,
+  private static String txStartedEvent(String globalTxId,
       String localTxId,
       String parentTxId,
-      String eventType,
       String username,
       String email) {
-    return (globalTxId + ":" + localTxId + ":" + parentTxId + ":" + eventType 
+ ":" + username + ":" + email).getBytes();
+    return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + 
TX_STARTED_EVENT + ":" + username + ":" + email;
+  }
+
+  private static String txEndedEvent(String globalTxId, String localTxId, 
String parentTxId) {
+    return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + 
TX_ENDED_EVENT;
   }
 }
diff --git 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java
similarity index 66%
copy from 
omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
copy to 
omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java
index 525da10..2cd8ee2 100644
--- 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
+++ 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java
@@ -17,14 +17,16 @@
 
 package io.servicecomb.saga.omega.transaction;
 
-class TxStartedEvent extends TxEvent {
+class PostTransactionInterceptor {
+  private final MessageSender sender;
+  private final MessageSerializer serializer;
 
-  TxStartedEvent(String globalTxId, String localTxId, String parentTxId, 
Object[] payloads) {
-    super(globalTxId, localTxId, parentTxId, payloads);
+  PostTransactionInterceptor(MessageSender sender, MessageSerializer 
serializer) {
+    this.sender = sender;
+    this.serializer = serializer;
   }
 
-  @Override
-  public String type() {
-    return this.getClass().getSimpleName();
+  void intercept(String globalTxId, String localTxId, String parentTxId) {
+    sender.send(serializer.serialize(new TxEndedEvent(globalTxId, localTxId, 
parentTxId)));
   }
 }
diff --git 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TransactionAspect.java
 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TransactionAspect.java
index cafc61a..e17861d 100644
--- 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TransactionAspect.java
+++ 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TransactionAspect.java
@@ -33,11 +33,13 @@ import io.servicecomb.saga.omega.context.OmegaContext;
 public class TransactionAspect {
   private static final Logger LOG = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private final PreTransactionInterceptor preTransactionInterceptor;
+  private final PostTransactionInterceptor postTransactionInterceptor;
   private final OmegaContext context;
 
   public TransactionAspect(MessageSerializer serializer, MessageSender sender, 
OmegaContext context) {
     this.context = context;
     this.preTransactionInterceptor = new PreTransactionInterceptor(sender, 
serializer);
+    this.postTransactionInterceptor = new PostTransactionInterceptor(sender, 
serializer);
   }
 
   @Around("execution(@javax.transaction.Transactional * *(..))")
@@ -45,12 +47,25 @@ public class TransactionAspect {
     Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
     LOG.debug("Intercepting transactional method {} with context {}", 
method.toString(), context);
 
+    preIntercept(joinPoint);
+    Object result = joinPoint.proceed();
+    postIntercept();
+
+    return result;
+  }
+
+  private void preIntercept(ProceedingJoinPoint joinPoint) {
     preTransactionInterceptor.intercept(
         context.globalTxId(),
         context.localTxId(),
         context.parentTxId(),
         joinPoint.getArgs());
+  }
 
-    return joinPoint.proceed();
+  private void postIntercept() {
+    postTransactionInterceptor.intercept(
+        context.globalTxId(),
+        context.localTxId(),
+        context.parentTxId());
   }
 }
diff --git 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java
similarity index 75%
copy from 
omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
copy to 
omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java
index 525da10..6cc8f79 100644
--- 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
+++ 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java
@@ -17,14 +17,8 @@
 
 package io.servicecomb.saga.omega.transaction;
 
-class TxStartedEvent extends TxEvent {
-
-  TxStartedEvent(String globalTxId, String localTxId, String parentTxId, 
Object[] payloads) {
-    super(globalTxId, localTxId, parentTxId, payloads);
-  }
-
-  @Override
-  public String type() {
-    return this.getClass().getSimpleName();
+class TxEndedEvent extends TxEvent {
+  TxEndedEvent(String globalTxId, String localTxId, String parentTxId) {
+    super(globalTxId, localTxId, parentTxId);
   }
 }
diff --git 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEvent.java
 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEvent.java
index e011aeb..2ab3d75 100644
--- 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEvent.java
+++ 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEvent.java
@@ -23,7 +23,7 @@ public abstract class TxEvent {
   private final String parentTxId;
   private final Object[] payloads;
 
-  TxEvent(String globalTxId, String localTxId, String parentTxId, Object[] 
payloads) {
+  TxEvent(String globalTxId, String localTxId, String parentTxId, Object... 
payloads) {
     this.localTxId = localTxId;
     this.parentTxId = parentTxId;
     this.payloads = payloads;
@@ -46,5 +46,7 @@ public abstract class TxEvent {
     return payloads;
   }
 
-  public abstract String type();
+  public String type() {
+    return this.getClass().getSimpleName();
+  }
 }
diff --git 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
index 525da10..830104f 100644
--- 
a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
+++ 
b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxStartedEvent.java
@@ -22,9 +22,4 @@ class TxStartedEvent extends TxEvent {
   TxStartedEvent(String globalTxId, String localTxId, String parentTxId, 
Object[] payloads) {
     super(globalTxId, localTxId, parentTxId, payloads);
   }
-
-  @Override
-  public String type() {
-    return this.getClass().getSimpleName();
-  }
 }
diff --git 
a/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptorTest.java
 
b/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptorTest.java
new file mode 100644
index 0000000..a15e6d1
--- /dev/null
+++ 
b/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptorTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.saga.omega.transaction;
+
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.junit.Test;
+
+public class PostTransactionInterceptorTest {
+  private final List<byte[]> messages = new ArrayList<>();
+  private final String globalTxId = UUID.randomUUID().toString();
+  private final String localTxId = UUID.randomUUID().toString();
+  private final String parentTxId = UUID.randomUUID().toString();
+
+  private final MessageSender sender = messages::add;
+  private final MessageSerializer serializer = event -> serialize(globalTxId, 
localTxId, parentTxId);
+
+  private final PostTransactionInterceptor interceptor = new 
PostTransactionInterceptor(sender, serializer);
+
+  private byte[] serialize(String globalTxId, String localTxId, String 
parentTxId) {
+    return (globalTxId + ":" + localTxId + ":" + parentTxId).getBytes();
+  }
+
+  @Test
+  public void sendsSerializedMessage() throws Exception {
+    interceptor.intercept(globalTxId, localTxId, parentTxId);
+
+    assertThat(messages, contains(serialize(globalTxId, localTxId, 
parentTxId)));
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <commits@servicecomb.apache.org>.

Reply via email to