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 b7083fb4bae799c91b4f379f7f5b91f8bbcc8e21 Author: seanyinx <[email protected]> AuthorDate: Thu Dec 28 16:55:12 2017 +0800 SCB-98 included compensation method signature in TxEvent Signed-off-by: seanyinx <[email protected]> --- .../connector/thrift/ThriftMessageSender.java | 1 + .../connector/thrift/ThriftMessageSenderTest.java | 3 ++- .../saga/omega/format/NativeMessageFormatTest.java | 2 +- .../spring/TransactionInterceptionTest.java | 17 ++++++++----- .../transaction/PostTransactionInterceptor.java | 4 ++-- .../transaction/PreTransactionInterceptor.java | 4 ++-- .../saga/omega/transaction/TransactionAspect.java | 23 ++++++++++++++---- .../saga/omega/transaction/TxEndedEvent.java | 4 ++-- .../saga/omega/transaction/TxEvent.java | 8 ++++++- .../saga/omega/transaction/TxStartedEvent.java | 4 ++-- .../PostTransactionInterceptorTest.java | 21 +++++++++------- .../transaction/PreTransactionInterceptorTest.java | 28 +++++++++++----------- .../saga/pack/contracts/thrift/SwiftTxEvent.java | 15 +++++++++++- 13 files changed, 88 insertions(+), 46 deletions(-) diff --git a/omega/omega-connector/omega-connector-thrift/src/main/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSender.java b/omega/omega-connector/omega-connector-thrift/src/main/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSender.java index abdbec5..44499b3 100644 --- a/omega/omega-connector/omega-connector-thrift/src/main/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSender.java +++ b/omega/omega-connector/omega-connector-thrift/src/main/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSender.java @@ -40,6 +40,7 @@ public class ThriftMessageSender implements MessageSender, AutoCloseable { event.localTxId(), event.parentTxId(), event.type(), + event.compensationMethod(), serializer.serialize(event) )); } diff --git a/omega/omega-connector/omega-connector-thrift/src/test/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSenderTest.java b/omega/omega-connector/omega-connector-thrift/src/test/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSenderTest.java index 9d0ea97..05f984c 100644 --- a/omega/omega-connector/omega-connector-thrift/src/test/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSenderTest.java +++ b/omega/omega-connector/omega-connector-thrift/src/test/java/io/servicecomb/saga/omega/connector/thrift/ThriftMessageSenderTest.java @@ -67,13 +67,14 @@ public class ThriftMessageSenderTest { @Test public void sendSerializedEvent() throws Exception { - TxEvent event = new TxEvent(globalTxId, localTxId, parentTxId, payload1, payload2); + TxEvent event = new TxEvent(globalTxId, localTxId, parentTxId, getClass().getCanonicalName(), payload1, payload2); messageSender.send(event); assertThat(swiftTxEvent.globalTxId(), is(event.globalTxId())); assertThat(swiftTxEvent.localTxId(), is(event.localTxId())); assertThat(swiftTxEvent.parentTxId(), is(event.parentTxId())); + assertThat(swiftTxEvent.compensationMethod(), is(event.compensationMethod())); assertThat(swiftTxEvent.payloads(), is(serializer.serialize(event))); } } diff --git a/omega/omega-format/src/test/java/io/servicecomb/saga/omega/format/NativeMessageFormatTest.java b/omega/omega-format/src/test/java/io/servicecomb/saga/omega/format/NativeMessageFormatTest.java index 4c93270..210aab1 100644 --- a/omega/omega-format/src/test/java/io/servicecomb/saga/omega/format/NativeMessageFormatTest.java +++ b/omega/omega-format/src/test/java/io/servicecomb/saga/omega/format/NativeMessageFormatTest.java @@ -62,7 +62,7 @@ public class NativeMessageFormatTest { } private TxEvent eventOf(Object... payloads) { - return new TxEvent(null, null, null, payloads); + return new TxEvent(null, null, null, null, payloads); } private static class NotSerializable { 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 8b873b8..e110713 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 @@ -90,10 +90,12 @@ public class TransactionInterceptionTest { public void sendsUserToRemote_AroundTransaction() throws Exception { User user = userService.add(new User(username, email)); + String compensationMethod = TransactionalUserService.class.getDeclaredMethod("delete", User.class).toString(); + assertEquals( asList( - txStartedEvent(globalTxId, localTxId, parentTxId, username, email), - txEndedEvent(globalTxId, localTxId, parentTxId)), + txStartedEvent(globalTxId, localTxId, parentTxId, compensationMethod, username, email), + txEndedEvent(globalTxId, localTxId, parentTxId, compensationMethod)), toString(messages) ); @@ -149,12 +151,14 @@ public class TransactionInterceptionTest { return txStartedEvent(event.globalTxId(), event.localTxId(), event.parentTxId(), + event.compensationMethod(), user.username(), user.email()).getBytes(); } return txEndedEvent(event.globalTxId(), event.localTxId(), - event.parentTxId()).getBytes(); + event.parentTxId(), + event.compensationMethod()).getBytes(); } @Bean @@ -166,12 +170,13 @@ public class TransactionInterceptionTest { private static String txStartedEvent(String globalTxId, String localTxId, String parentTxId, + String compensationMethod, String username, String email) { - return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + TX_STARTED_EVENT + ":" + username + ":" + email; + return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + compensationMethod + ":" + TX_STARTED_EVENT + ":" + username + ":" + email; } - private static String txEndedEvent(String globalTxId, String localTxId, String parentTxId) { - return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + TX_ENDED_EVENT; + private static String txEndedEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod) { + return globalTxId + ":" + localTxId + ":" + parentTxId + ":" + compensationMethod + ":" + TX_ENDED_EVENT; } } diff --git a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java index a359ee2..9ea4191 100644 --- a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java +++ b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PostTransactionInterceptor.java @@ -24,7 +24,7 @@ class PostTransactionInterceptor { this.sender = sender; } - void intercept(String globalTxId, String localTxId, String parentTxId) { - sender.send(new TxEndedEvent(globalTxId, localTxId, parentTxId)); + void intercept(String globalTxId, String localTxId, String parentTxId, String compensationMethod) { + sender.send(new TxEndedEvent(globalTxId, localTxId, parentTxId, compensationMethod)); } } diff --git a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptor.java b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptor.java index 2c49d48..a2ea5b0 100644 --- a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptor.java +++ b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptor.java @@ -24,7 +24,7 @@ class PreTransactionInterceptor { this.sender = sender; } - void intercept(String globalTxId, String localTxId, String parentTxId, Object... message) { - sender.send(new TxStartedEvent(globalTxId, localTxId, parentTxId, message)); + void intercept(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Object... message) { + sender.send(new TxStartedEvent(globalTxId, localTxId, parentTxId, compensationMethod, message)); } } 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 e4de9c9..674d1a7 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 @@ -48,25 +48,38 @@ public class TransactionAspect { Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); LOG.debug("Intercepting compensable method {} with context {}", method.toString(), context); - preIntercept(joinPoint); + String signature = compensationMethodSignature(joinPoint, compensable, method); + + preIntercept(joinPoint, signature); Object result = joinPoint.proceed(); - postIntercept(); + postIntercept(signature); return result; } - private void preIntercept(ProceedingJoinPoint joinPoint) { + private String compensationMethodSignature(ProceedingJoinPoint joinPoint, Compensable compensable, Method method) + throws NoSuchMethodException { + + return joinPoint.getTarget() + .getClass() + .getDeclaredMethod(compensable.compensationMethod(), method.getParameterTypes()) + .toString(); + } + + private void preIntercept(ProceedingJoinPoint joinPoint, String signature) { preTransactionInterceptor.intercept( context.globalTxId(), context.localTxId(), context.parentTxId(), + signature, joinPoint.getArgs()); } - private void postIntercept() { + private void postIntercept(String signature) { postTransactionInterceptor.intercept( context.globalTxId(), context.localTxId(), - context.parentTxId()); + context.parentTxId(), + signature); } } diff --git a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java index 6cc8f79..2836948 100644 --- a/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java +++ b/omega/omega-transaction/src/main/java/io/servicecomb/saga/omega/transaction/TxEndedEvent.java @@ -18,7 +18,7 @@ package io.servicecomb.saga.omega.transaction; class TxEndedEvent extends TxEvent { - TxEndedEvent(String globalTxId, String localTxId, String parentTxId) { - super(globalTxId, localTxId, parentTxId); + TxEndedEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod) { + super(globalTxId, localTxId, parentTxId, compensationMethod); } } 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 b53e64c..1616f69 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 @@ -22,12 +22,14 @@ public class TxEvent { private final String globalTxId; private final String localTxId; private final String parentTxId; + private final String compensationMethod; private final Object[] payloads; - public TxEvent(String globalTxId, String localTxId, String parentTxId, Object... payloads) { + public TxEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Object... payloads) { this.timestamp = System.currentTimeMillis(); this.localTxId = localTxId; this.parentTxId = parentTxId; + this.compensationMethod = compensationMethod; this.payloads = payloads; this.globalTxId = globalTxId; } @@ -55,4 +57,8 @@ public class TxEvent { public String type() { return this.getClass().getSimpleName(); } + + public String compensationMethod() { + return compensationMethod; + } } 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 830104f..7ef3089 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 @@ -19,7 +19,7 @@ package io.servicecomb.saga.omega.transaction; class TxStartedEvent extends TxEvent { - TxStartedEvent(String globalTxId, String localTxId, String parentTxId, Object[] payloads) { - super(globalTxId, localTxId, parentTxId, payloads); + TxStartedEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Object[] payloads) { + super(globalTxId, localTxId, parentTxId, compensationMethod, payloads); } } 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 index 7c72513..86a671f 100644 --- 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 @@ -17,7 +17,7 @@ package io.servicecomb.saga.omega.transaction; -import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import java.util.ArrayList; @@ -27,23 +27,26 @@ import java.util.UUID; import org.junit.Test; public class PostTransactionInterceptorTest { - private final List<byte[]> messages = new ArrayList<>(); + private final List<TxEvent> 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 = (msg) -> messages.add(serialize(msg.globalTxId(), msg.localTxId(), msg.parentTxId())); + private final MessageSender sender = messages::add; private final PostTransactionInterceptor interceptor = new PostTransactionInterceptor(sender); - 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); + interceptor.intercept(globalTxId, localTxId, parentTxId, getClass().getCanonicalName()); + + + TxEvent event = messages.get(0); - assertThat(messages, contains(serialize(globalTxId, localTxId, parentTxId))); + assertThat(event.globalTxId(), is(globalTxId)); + assertThat(event.localTxId(), is(localTxId)); + assertThat(event.parentTxId(), is(parentTxId)); + assertThat(event.compensationMethod(), is(getClass().getCanonicalName())); + assertThat(event.payloads().length, is(0)); } } diff --git a/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptorTest.java b/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptorTest.java index db6a53d..b7b2ec0 100644 --- a/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptorTest.java +++ b/omega/omega-transaction/src/test/java/io/servicecomb/saga/omega/transaction/PreTransactionInterceptorTest.java @@ -18,7 +18,9 @@ package io.servicecomb.saga.omega.transaction; import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify; -import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static java.util.Arrays.asList; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import java.util.ArrayList; @@ -28,28 +30,26 @@ import java.util.UUID; import org.junit.Test; public class PreTransactionInterceptorTest { - private final List<byte[]> messages = new ArrayList<>(); + private final List<TxEvent> 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 = (msg) -> messages.add( - serialize(msg.globalTxId(), - msg.localTxId(), - msg.parentTxId(), - (String) msg.payloads()[0])); + private final MessageSender sender = messages::add; private final String message = uniquify("message"); private final PreTransactionInterceptor interceptor = new PreTransactionInterceptor(sender); - private byte[] serialize(String globalTxId, String localTxId, String parentTxId, String message) { - return (globalTxId + ":" + localTxId + ":" + parentTxId + ":" + message).getBytes(); - } - @Test - public void sendsSerializedMessage() throws Exception { - interceptor.intercept(globalTxId, localTxId, parentTxId, message); + public void sendsTxStartedEvent() throws Exception { + interceptor.intercept(globalTxId, localTxId, parentTxId, getClass().getCanonicalName(), message); + + TxEvent event = messages.get(0); - assertThat(messages, contains(serialize(globalTxId, localTxId, parentTxId, message))); + assertThat(event.globalTxId(), is(globalTxId)); + assertThat(event.localTxId(), is(localTxId)); + assertThat(event.parentTxId(), is(parentTxId)); + assertThat(event.compensationMethod(), is(getClass().getCanonicalName())); + assertThat(asList(event.payloads()), contains(message)); } } diff --git a/pack-contracts/pack-contract-thrift/src/main/java/io/servicecomb/saga/pack/contracts/thrift/SwiftTxEvent.java b/pack-contracts/pack-contract-thrift/src/main/java/io/servicecomb/saga/pack/contracts/thrift/SwiftTxEvent.java index 75f6e12..9395142 100644 --- a/pack-contracts/pack-contract-thrift/src/main/java/io/servicecomb/saga/pack/contracts/thrift/SwiftTxEvent.java +++ b/pack-contracts/pack-contract-thrift/src/main/java/io/servicecomb/saga/pack/contracts/thrift/SwiftTxEvent.java @@ -29,15 +29,23 @@ public class SwiftTxEvent { private final String parentTxId; private final String type; private final byte[] payloads; + private final String compensationMethod; @ThriftConstructor - public SwiftTxEvent(long timestamp, String globalTxId, String localTxId, String parentTxId, String type, byte[] payloads) { + public SwiftTxEvent(long timestamp, + String globalTxId, + String localTxId, + String parentTxId, + String type, + String compensationMethod, + byte[] payloads) { this.timestamp = timestamp; this.globalTxId = globalTxId; this.localTxId = localTxId; this.parentTxId = parentTxId; this.type = type; this.payloads = payloads; + this.compensationMethod = compensationMethod; } @ThriftField(1) @@ -66,6 +74,11 @@ public class SwiftTxEvent { } @ThriftField(6) + public String compensationMethod() { + return compensationMethod; + } + + @ThriftField(7) public byte[] payloads() { return payloads; } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
