You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2017/12/25 10:36:31 UTC
[incubator-servicecomb-saga] 07/14: SCB-96 added post transaction
interception
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 <se...@huawei.com>
AuthorDate: Sat Dec 23 10:39:59 2017 +0800
SCB-96 added post transaction interception
Signed-off-by: seanyinx <se...@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" <co...@servicecomb.apache.org>.