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 <[email protected]> AuthorDate: Mon Dec 25 10:05:39 2017 +0800 SCB-96 linked tx ids with omega context and request headers Signed-off-by: seanyinx <[email protected]> --- .../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 "[email protected]" <[email protected]>.
