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:37 UTC

[incubator-servicecomb-saga] 13/14: SCB-96 linked tx ids with omega context and request headers

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 68229f522304d6524813ce6c7b597ae85c3414a6
Author: seanyinx <se...@huawei.com>
AuthorDate: Mon Dec 25 10:05:39 2017 +0800

    SCB-96 linked tx ids with omega context and request headers
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .../saga/omega/context/IdGenerator.java}           | 13 ++----
 .../transport/resttemplate/RestTemplateConfig.java |  7 +--
 .../TransactionClientHttpRequestInterceptor.java   | 37 ++++++++++++---
 .../transport/resttemplate/UniqueIdGenerator.java  |  2 +-
 ...ransactionClientHttpRequestInterceptorTest.java | 52 ++++++++++++++++------
 omega/omega-transport/pom.xml                      |  8 ++--
 6 files changed, 82 insertions(+), 37 deletions(-)

diff --git a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java b/omega/omega-context/src/main/java/io/servicecomb/saga/omega/context/IdGenerator.java
similarity index 74%
copy from omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java
copy to omega/omega-context/src/main/java/io/servicecomb/saga/omega/context/IdGenerator.java
index 17ef7ce..88de1a4 100644
--- a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java
+++ b/omega/omega-context/src/main/java/io/servicecomb/saga/omega/context/IdGenerator.java
@@ -13,18 +13,13 @@
  * 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.transport.resttemplate;
+package io.servicecomb.saga.omega.context;
 
-import java.util.UUID;
+import java.io.Serializable;
 
-import io.servicecomb.saga.core.IdGenerator;
+public interface IdGenerator<T extends Serializable> {
 
-public class UniqueIdGenerator implements IdGenerator<String> {
-  @Override
-  public String nextId() {
-    return UUID.randomUUID().toString();
-  }
+  T nextId();
 }
diff --git a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/RestTemplateConfig.java b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/RestTemplateConfig.java
index 3a14e4b..34683b1 100644
--- a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/RestTemplateConfig.java
+++ b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/RestTemplateConfig.java
@@ -25,7 +25,8 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.http.client.ClientHttpRequestInterceptor;
 import org.springframework.web.client.RestTemplate;
 
-import io.servicecomb.saga.core.IdGenerator;
+import io.servicecomb.saga.omega.context.IdGenerator;
+import io.servicecomb.saga.omega.context.OmegaContext;
 
 @Configuration
 public class RestTemplateConfig {
@@ -36,10 +37,10 @@ public class RestTemplateConfig {
   }
 
   @Bean
-  public RestTemplate restTemplate(IdGenerator<String> idGenerator) {
+  public RestTemplate restTemplate(IdGenerator<String> idGenerator, OmegaContext context) {
     RestTemplate template = new RestTemplate();
     List<ClientHttpRequestInterceptor> interceptors = template.getInterceptors();
-    interceptors.add(new TransactionClientHttpRequestInterceptor(idGenerator));
+    interceptors.add(new TransactionClientHttpRequestInterceptor(context, idGenerator));
     template.setInterceptors(interceptors);
     return template;
   }
diff --git a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptor.java b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptor.java
index f913489..158fbc8 100644
--- a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptor.java
+++ b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptor.java
@@ -25,25 +25,48 @@ import org.springframework.http.client.ClientHttpRequestExecution;
 import org.springframework.http.client.ClientHttpRequestInterceptor;
 import org.springframework.http.client.ClientHttpResponse;
 
-import io.servicecomb.saga.core.IdGenerator;
+import io.servicecomb.saga.omega.context.IdGenerator;
+import io.servicecomb.saga.omega.context.OmegaContext;
 
 public class TransactionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
 
-  public static final String TRANSACTION_ID_KEY = "X-Transaction-Id";
+  public static final String GLOBAL_TX_ID_KEY = "X-Pack-Global-Transaction-Id";
+  public static final String LOCAL_TX_ID_KEY = "X-Pack-Local-Transaction-Id";
 
+  private final OmegaContext omegaContext;
   private final IdGenerator<String> idGenerator;
 
-  public TransactionClientHttpRequestInterceptor(IdGenerator<String> idGenerator) {
+  TransactionClientHttpRequestInterceptor(OmegaContext omegaContext, IdGenerator<String> idGenerator) {
+    this.omegaContext = omegaContext;
     this.idGenerator = idGenerator;
   }
 
   @Override
   public ClientHttpResponse intercept(HttpRequest request, byte[] body,
       ClientHttpRequestExecution execution) throws IOException {
-    if (!request.getHeaders().containsKey(TRANSACTION_ID_KEY)) {
-      String txId = idGenerator.nextId();
-      request.getHeaders().add(TRANSACTION_ID_KEY, txId);
-    }
+
+    request.getHeaders().add(GLOBAL_TX_ID_KEY, globalTxId());
+    request.getHeaders().add(LOCAL_TX_ID_KEY, localTxId());
     return execution.execute(request, body);
   }
+
+  private String globalTxId() {
+    String globalTxId = omegaContext.globalTxId();
+
+    if (globalTxId == null) {
+      globalTxId = idGenerator.nextId();
+      omegaContext.setGlobalTxId(globalTxId);
+    }
+    return globalTxId;
+  }
+
+  private String localTxId() {
+    String localTxId = omegaContext.localTxId();
+
+    if (localTxId == null) {
+      localTxId = idGenerator.nextId();
+      omegaContext.setLocalTxId(localTxId);
+    }
+    return localTxId;
+  }
 }
diff --git a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java
index 17ef7ce..8cb3eb1 100644
--- a/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java
+++ b/omega/omega-transport/omega-transport-resttemplate/src/main/java/io/servicecomb/saga/omega/transport/resttemplate/UniqueIdGenerator.java
@@ -20,7 +20,7 @@ package io.servicecomb.saga.omega.transport.resttemplate;
 
 import java.util.UUID;
 
-import io.servicecomb.saga.core.IdGenerator;
+import io.servicecomb.saga.omega.context.IdGenerator;
 
 public class UniqueIdGenerator implements IdGenerator<String> {
   @Override
diff --git a/omega/omega-transport/omega-transport-resttemplate/src/test/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptorTest.java b/omega/omega-transport/omega-transport-resttemplate/src/test/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptorTest.java
index fa79858..41da9ec 100644
--- a/omega/omega-transport/omega-transport-resttemplate/src/test/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptorTest.java
+++ b/omega/omega-transport/omega-transport-resttemplate/src/test/java/io/servicecomb/saga/omega/transport/resttemplate/TransactionClientHttpRequestInterceptorTest.java
@@ -18,37 +18,54 @@
 
 package io.servicecomb.saga.omega.transport.resttemplate;
 
-import static io.servicecomb.saga.omega.transport.resttemplate.TransactionClientHttpRequestInterceptor.TRANSACTION_ID_KEY;
-import static org.hamcrest.Matchers.notNullValue;
+import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
+import static io.servicecomb.saga.omega.transport.resttemplate.TransactionClientHttpRequestInterceptor.GLOBAL_TX_ID_KEY;
+import static io.servicecomb.saga.omega.transport.resttemplate.TransactionClientHttpRequestInterceptor.LOCAL_TX_ID_KEY;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpRequest;
 import org.springframework.http.client.ClientHttpRequestExecution;
 import org.springframework.http.client.ClientHttpRequestInterceptor;
 import org.springframework.http.client.ClientHttpResponse;
 
+import io.servicecomb.saga.omega.context.IdGenerator;
+import io.servicecomb.saga.omega.context.OmegaContext;
+
+@SuppressWarnings("unchecked")
 @RunWith(JUnit4.class)
 public class TransactionClientHttpRequestInterceptorTest {
 
-  private HttpRequest request = mock(HttpRequest.class);
+  private final HttpRequest request = mock(HttpRequest.class);
+
+  private final ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
 
-  private ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
+  private final ClientHttpResponse response = mock(ClientHttpResponse.class);
 
-  private ClientHttpResponse response = mock(ClientHttpResponse.class);
+  private final String globalTxId = uniquify("global tx id");
+  private final String localTxId = uniquify("local tx id");
+  private final IdGenerator<String> idGenerator = Mockito.mock(IdGenerator.class);
 
-  private ClientHttpRequestInterceptor clientHttpRequestInterceptor = new TransactionClientHttpRequestInterceptor(
-      new UniqueIdGenerator());
+  private final OmegaContext omegaContext = new OmegaContext();
+  private final ClientHttpRequestInterceptor clientHttpRequestInterceptor = new TransactionClientHttpRequestInterceptor(
+      omegaContext,
+      idGenerator);
+
+  @Before
+  public void setUp() throws Exception {
+    when(idGenerator.nextId()).thenReturn(globalTxId, localTxId);
+  }
 
   @Test
   public void newTransactionIdInHeaderIfNonExists() throws IOException {
@@ -58,19 +75,28 @@ public class TransactionClientHttpRequestInterceptorTest {
 
     clientHttpRequestInterceptor.intercept(request, null, execution);
 
-    assertThat(request.getHeaders().getOrDefault(TRANSACTION_ID_KEY, null), is(notNullValue()));
+    assertThat(request.getHeaders().get(GLOBAL_TX_ID_KEY), contains(globalTxId));
+    assertThat(request.getHeaders().get(LOCAL_TX_ID_KEY), contains(localTxId));
+
+    assertThat(omegaContext.globalTxId(), is(globalTxId));
+    assertThat(omegaContext.localTxId(), is(localTxId));
   }
 
   @Test
   public void sameTransactionIdInHeaderIfAlreadyExists() throws IOException {
+    omegaContext.setGlobalTxId(globalTxId);
+    omegaContext.setLocalTxId(localTxId);
+
     HttpHeaders headers = new HttpHeaders();
-    headers.add(TRANSACTION_ID_KEY, "txId");
     when(request.getHeaders()).thenReturn(headers);
     when(execution.execute(request, null)).thenReturn(response);
 
     clientHttpRequestInterceptor.intercept(request, null, execution);
 
-    List<String> expected = Collections.singletonList("txId");
-    assertThat(request.getHeaders().getOrDefault(TRANSACTION_ID_KEY, null), is(expected));
+    assertThat(request.getHeaders().get(GLOBAL_TX_ID_KEY), contains(globalTxId));
+    assertThat(request.getHeaders().get(LOCAL_TX_ID_KEY), contains(localTxId));
+
+    assertThat(omegaContext.globalTxId(), is(globalTxId));
+    assertThat(omegaContext.localTxId(), is(localTxId));
   }
 }
\ No newline at end of file
diff --git a/omega/omega-transport/pom.xml b/omega/omega-transport/pom.xml
index 7f2dc52..79359e1 100644
--- a/omega/omega-transport/pom.xml
+++ b/omega/omega-transport/pom.xml
@@ -40,10 +40,6 @@
     </dependency>
     <dependency>
       <groupId>io.servicecomb.saga</groupId>
-      <artifactId>saga-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.servicecomb.saga</groupId>
       <artifactId>omega-transaction</artifactId>
     </dependency>
 
@@ -63,5 +59,9 @@
       <groupId>com.github.tomakehurst</groupId>
       <artifactId>wiremock-standalone</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.seanyinx</groupId>
+      <artifactId>unit-scaffolding</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file

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