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