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>.