diff --git a/src/main/java/com/uber/cadence/serviceclient/CallMetaData.java b/src/main/java/com/uber/cadence/serviceclient/CallMetaData.java new file mode 100644 index 00000000..8dd7a870 --- /dev/null +++ b/src/main/java/com/uber/cadence/serviceclient/CallMetaData.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 com.uber.cadence.serviceclient; + +import java.time.Duration; +import java.util.Optional; + +public class CallMetaData { + private Duration timeout; + + public CallMetaData(Duration timeout) { + this.timeout = timeout; + } + + public CallMetaData withTimeout(Duration timeout) { + this.timeout = timeout; + return this; + } + + public Optional getTimeout() { + return timeout == null ? Optional.empty() : Optional.of(timeout); + } +} diff --git a/src/main/java/com/uber/cadence/serviceclient/IWorkflowServiceV4.java b/src/main/java/com/uber/cadence/serviceclient/IWorkflowServiceV4.java new file mode 100644 index 00000000..9d240193 --- /dev/null +++ b/src/main/java/com/uber/cadence/serviceclient/IWorkflowServiceV4.java @@ -0,0 +1,103 @@ +/* + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 com.uber.cadence.serviceclient; + +import com.uber.cadence.api.v1.*; +import java.util.concurrent.CompletableFuture; +import javax.annotation.Nullable; + +public interface IWorkflowServiceV4 { + CompletableFuture startWorkflowExecution( + StartWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture startWorkflowExecutionAsync( + StartWorkflowExecutionAsyncRequest request, @Nullable CallMetaData meta); + + CompletableFuture signalWorkflowExecution( + SignalWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture signalWithStartWorkflowExecution( + SignalWithStartWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture + signalWithStartWorkflowExecutionAsync( + SignalWithStartWorkflowExecutionAsyncRequest request, @Nullable CallMetaData meta); + + CompletableFuture getWorkflowExecutionHistory( + GetWorkflowExecutionHistoryRequest request, @Nullable CallMetaData meta); + + CompletableFuture queryWorkflow( + QueryWorkflowRequest request, @Nullable CallMetaData meta); + + CompletableFuture requestCancelWorkflowExecution( + RequestCancelWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture terminateWorkflowExecution( + TerminateWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture restartWorkflowExecution( + RestartWorkflowExecutionRequest request, @Nullable CallMetaData meta); + + CompletableFuture listWorkflowExecutions( + ListWorkflowExecutionsRequest request, @Nullable CallMetaData meta); + + CompletableFuture scanWorkflowExecutions( + ScanWorkflowExecutionsRequest request, @Nullable CallMetaData meta); + + CompletableFuture listOpenWorkflowExecutions( + ListOpenWorkflowExecutionsRequest request, @Nullable CallMetaData meta); + + CompletableFuture listClosedWorkflowExecutions( + ListClosedWorkflowExecutionsRequest request, @Nullable CallMetaData meta); + + CompletableFuture countWorkflowExecutions( + CountWorkflowExecutionsRequest request, @Nullable CallMetaData meta); + + CompletableFuture pollForActivityTask( + PollForActivityTaskRequest request, @Nullable CallMetaData meta); + + CompletableFuture recordActivityTaskHeartbeat( + RecordActivityTaskHeartbeatRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskCanceled( + RespondActivityTaskCanceledRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskCanceledByID( + RespondActivityTaskCanceledByIDRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskFailed( + RespondActivityTaskFailedRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskFailedByID( + RespondActivityTaskFailedByIDRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskCompleted( + RespondActivityTaskCompletedRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondActivityTaskCompletedByID( + RespondActivityTaskCompletedByIDRequest request, @Nullable CallMetaData meta); + + CompletableFuture pollForDecisionTask( + PollForDecisionTaskRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondDecisionTaskFailed( + RespondDecisionTaskFailedRequest request, @Nullable CallMetaData meta); + + CompletableFuture respondDecisionTaskCompleted( + RespondDecisionTaskCompletedRequest request, @Nullable CallMetaData meta); +} diff --git a/src/main/java/com/uber/cadence/serviceclient/WorkflowServiceGrpc.java b/src/main/java/com/uber/cadence/serviceclient/WorkflowServiceGrpc.java new file mode 100644 index 00000000..8520cbab --- /dev/null +++ b/src/main/java/com/uber/cadence/serviceclient/WorkflowServiceGrpc.java @@ -0,0 +1,339 @@ +/* + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 com.uber.cadence.serviceclient; + +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import com.uber.cadence.api.v1.*; +import com.uber.cadence.internal.compatibility.proto.serviceclient.IGrpcServiceStubs; +import io.grpc.*; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; + +public class WorkflowServiceGrpc implements IWorkflowServiceV4 { + + private final IGrpcServiceStubs grpcServiceStubs; + + WorkflowServiceGrpc(ClientOptions options) { + this.grpcServiceStubs = IGrpcServiceStubs.newInstance(options); + } + + @Override + public CompletableFuture startWorkflowExecution( + StartWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .startWorkflowExecution(request)); + } + + @Override + public CompletableFuture startWorkflowExecutionAsync( + StartWorkflowExecutionAsyncRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .startWorkflowExecutionAsync(request)); + } + + @Override + public CompletableFuture signalWorkflowExecution( + SignalWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .signalWorkflowExecution(request)); + } + + @Override + public CompletableFuture + signalWithStartWorkflowExecution( + SignalWithStartWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .signalWithStartWorkflowExecution(request)); + } + + @Override + public CompletableFuture + signalWithStartWorkflowExecutionAsync( + SignalWithStartWorkflowExecutionAsyncRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .signalWithStartWorkflowExecutionAsync(request)); + } + + @Override + public CompletableFuture getWorkflowExecutionHistory( + GetWorkflowExecutionHistoryRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .getWorkflowExecutionHistory(request)); + } + + @Override + public CompletableFuture queryWorkflow( + QueryWorkflowRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .queryWorkflow(request)); + } + + @Override + public CompletableFuture requestCancelWorkflowExecution( + RequestCancelWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .requestCancelWorkflowExecution(request)); + } + + @Override + public CompletableFuture terminateWorkflowExecution( + TerminateWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .terminateWorkflowExecution(request)); + } + + @Override + public CompletableFuture restartWorkflowExecution( + RestartWorkflowExecutionRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workflowFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .restartWorkflowExecution(request)); + } + + @Override + public CompletableFuture listWorkflowExecutions( + ListWorkflowExecutionsRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .visibilityFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .listWorkflowExecutions(request)); + } + + @Override + public CompletableFuture scanWorkflowExecutions( + ScanWorkflowExecutionsRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .visibilityFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .scanWorkflowExecutions(request)); + } + + @Override + public CompletableFuture listOpenWorkflowExecutions( + ListOpenWorkflowExecutionsRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .visibilityFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .listOpenWorkflowExecutions(request)); + } + + @Override + public CompletableFuture listClosedWorkflowExecutions( + ListClosedWorkflowExecutionsRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .visibilityFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .listClosedWorkflowExecutions(request)); + } + + @Override + public CompletableFuture countWorkflowExecutions( + CountWorkflowExecutionsRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .visibilityFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .countWorkflowExecutions(request)); + } + + @Override + public CompletableFuture pollForActivityTask( + PollForActivityTaskRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .pollForActivityTask(request)); + } + + @Override + public CompletableFuture recordActivityTaskHeartbeat( + RecordActivityTaskHeartbeatRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .recordActivityTaskHeartbeat(request)); + } + + @Override + public CompletableFuture respondActivityTaskCanceled( + RespondActivityTaskCanceledRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskCanceled(request)); + } + + @Override + public CompletableFuture respondActivityTaskCanceledByID( + RespondActivityTaskCanceledByIDRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskCanceledByID(request)); + } + + @Override + public CompletableFuture respondActivityTaskFailed( + RespondActivityTaskFailedRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskFailed(request)); + } + + @Override + public CompletableFuture respondActivityTaskFailedByID( + RespondActivityTaskFailedByIDRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskFailedByID(request)); + } + + @Override + public CompletableFuture respondActivityTaskCompleted( + RespondActivityTaskCompletedRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskCompleted(request)); + } + + @Override + public CompletableFuture + respondActivityTaskCompletedByID( + RespondActivityTaskCompletedByIDRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondActivityTaskCompletedByID(request)); + } + + @Override + public CompletableFuture pollForDecisionTask( + PollForDecisionTaskRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .pollForDecisionTask(request)); + } + + @Override + public CompletableFuture respondDecisionTaskFailed( + RespondDecisionTaskFailedRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondDecisionTaskFailed(request)); + } + + @Override + public CompletableFuture respondDecisionTaskCompleted( + RespondDecisionTaskCompletedRequest request, @Nullable CallMetaData meta) { + return toCompletableFuture( + grpcServiceStubs + .workerFutureStub() + .withInterceptors(new CallMetadataClientInterceptor(meta)) + .respondDecisionTaskCompleted(request)); + } + + private static class CallMetadataClientInterceptor implements ClientInterceptor { + private final CallMetaData meta; + + CallMetadataClientInterceptor(CallMetaData meta) { + this.meta = meta; + } + + @Override + public ClientCall interceptCall( + MethodDescriptor method, CallOptions callOptions, Channel next) { + if (meta != null && meta.getTimeout().isPresent()) { + Duration timeout = meta.getTimeout().get(); + callOptions = callOptions.withDeadlineAfter(timeout.toMillis(), TimeUnit.MILLISECONDS); + } + return next.newCall(method, callOptions); + } + } + + private CompletableFuture toCompletableFuture(ListenableFuture listenable) { + CompletableFuture completableFuture = new CompletableFuture<>(); + Futures.addCallback( + listenable, + new FutureCallback() { + @Override + public void onSuccess(T t) { + completableFuture.complete(t); + } + + @Override + public void onFailure(Throwable throwable) { + completableFuture.completeExceptionally(throwable); + } + }, + MoreExecutors.directExecutor()); + return completableFuture; + } +}