diff --git a/examples/src/main/java/io/dapr/examples/actors/DemoActorClient.java b/examples/src/main/java/io/dapr/examples/actors/DemoActorClient.java index d25065f3b1..fb90d37cb5 100644 --- a/examples/src/main/java/io/dapr/examples/actors/DemoActorClient.java +++ b/examples/src/main/java/io/dapr/examples/actors/DemoActorClient.java @@ -6,6 +6,7 @@ package io.dapr.examples.actors; import io.dapr.actors.ActorId; +import io.dapr.actors.client.ActorClient; import io.dapr.actors.client.ActorProxyBuilder; import java.util.ArrayList; @@ -30,7 +31,8 @@ public class DemoActorClient { * @throws InterruptedException If program has been interrupted. */ public static void main(String[] args) throws InterruptedException { - try (ActorProxyBuilder builder = new ActorProxyBuilder(DemoActor.class)) { + try (ActorClient client = new ActorClient()) { + ActorProxyBuilder builder = new ActorProxyBuilder(DemoActor.class, client); List threads = new ArrayList<>(NUM_ACTORS); // Creates multiple actors. diff --git a/examples/src/main/java/io/dapr/examples/actors/README.md b/examples/src/main/java/io/dapr/examples/actors/README.md index 4f6855dea5..09b3a71d14 100644 --- a/examples/src/main/java/io/dapr/examples/actors/README.md +++ b/examples/src/main/java/io/dapr/examples/actors/README.md @@ -149,7 +149,8 @@ public class DemoActorClient { private static final int NUM_ACTORS = 3; public static void main(String[] args) throws InterruptedException { - try (ActorProxyBuilder builder = new ActorProxyBuilder(DemoActor.class)) { + try (ActorClient client = new ActorClient()) { + ActorProxyBuilder builder = new ActorProxyBuilder(DemoActor.class, client); ///... for (int i = 0; i < NUM_ACTORS; i++) { DemoActor actor = builder.build(ActorId.createRandom()); @@ -189,7 +190,7 @@ public class DemoActorClient { } ``` -First, the client defines how many actors it is going to create. The main method declares a `ActorProxyBuilder` to create instances of the `DemoActor` interface, which are implemented automatically by the SDK and make remote calls to the equivalent methods in Actor runtime. `ActorProxyBuilder` implements `Closeable`, which means it holds resources that need to be closed. In this example, we use the "try-resource" feature in Java. +First, the client defines how many actors it is going to create. The main method declares a `ActorClient` and `ActorProxyBuilder` to create instances of the `DemoActor` interface, which are implemented automatically by the SDK and make remote calls to the equivalent methods in Actor runtime. `ActorClient` is reusable for different actor types and should be instantiated only once in your code. `ActorClient` also implements `AutoCloseable`, which means it holds resources that need to be closed. In this example, we use the "try-resource" feature in Java. Then, the code executes the `callActorForever` private method once per actor. Initially, it will invoke `registerReminder()`, which sets the due time and period for the reminder. Then, `incrementAndGet()` increments a counter, persists it and sends it back as response. Finally `say` method which will print a message containing the received string along with the formatted server time. diff --git a/sdk-actors/src/main/java/io/dapr/actors/client/ActorClient.java b/sdk-actors/src/main/java/io/dapr/actors/client/ActorClient.java new file mode 100644 index 0000000000..ffd6a1fc70 --- /dev/null +++ b/sdk-actors/src/main/java/io/dapr/actors/client/ActorClient.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + */ + +package io.dapr.actors.client; + +import io.dapr.client.DaprApiProtocol; +import io.dapr.client.DaprHttpBuilder; +import io.dapr.config.Properties; +import io.dapr.v1.DaprGrpc; +import io.grpc.Channel; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import reactor.core.publisher.Mono; + +/** + * Holds a client for Dapr sidecar communication. ActorClient should be reused. + */ +public class ActorClient implements AutoCloseable { + + /** + * gRPC channel for communication with Dapr sidecar. + */ + private final ManagedChannel grpcManagedChannel; + + /** + * Dapr's client. + */ + private final DaprClient daprClient; + + /** + * Instantiates a new channel for Dapr sidecar communication. + */ + public ActorClient() { + this(Properties.API_PROTOCOL.get()); + } + + /** + * Instantiates a new channel for Dapr sidecar communication. + * + * @param apiProtocol Dapr's API protocol. + */ + private ActorClient(DaprApiProtocol apiProtocol) { + this(apiProtocol, buildManagedChannel(apiProtocol)); + } + + /** + * Instantiates a new channel for Dapr sidecar communication. + * + * @param apiProtocol Dapr's API protocol. + */ + private ActorClient(DaprApiProtocol apiProtocol, ManagedChannel grpcManagedChannel) { + this.grpcManagedChannel = grpcManagedChannel; + this.daprClient = buildDaprClient(apiProtocol, grpcManagedChannel); + } + + /** + * Invokes an Actor method on Dapr. + * + * @param actorType Type of actor. + * @param actorId Actor Identifier. + * @param methodName Method name to invoke. + * @param jsonPayload Serialized body. + * @return Asynchronous result with the Actor's response. + */ + Mono invoke(String actorType, String actorId, String methodName, byte[] jsonPayload) { + return daprClient.invoke(actorType, actorId, methodName, jsonPayload); + } + + /** + * {@inheritDoc} + */ + @Override + public void close() { + if (grpcManagedChannel != null && !grpcManagedChannel.isShutdown()) { + grpcManagedChannel.shutdown(); + } + } + + /** + * Creates a GRPC managed channel (or null, if not applicable). + * + * @param apiProtocol Dapr's API protocol. + * @return GRPC managed channel or null. + */ + private static ManagedChannel buildManagedChannel(DaprApiProtocol apiProtocol) { + if (apiProtocol != DaprApiProtocol.GRPC) { + return null; + } + + int port = Properties.GRPC_PORT.get(); + if (port <= 0) { + throw new IllegalArgumentException("Invalid port."); + } + + return ManagedChannelBuilder.forAddress(Properties.SIDECAR_IP.get(), port).usePlaintext().build(); + } + + /** + * Build an instance of the Client based on the provided setup. + * + * @return an instance of the setup Client + * @throws java.lang.IllegalStateException if any required field is missing + */ + private static DaprClient buildDaprClient(DaprApiProtocol apiProtocol, Channel grpcManagedChannel) { + switch (apiProtocol) { + case GRPC: return new DaprGrpcClient(DaprGrpc.newFutureStub(grpcManagedChannel)); + case HTTP: return new DaprHttpClient(new DaprHttpBuilder().build()); + default: throw new IllegalStateException("Unsupported protocol: " + apiProtocol.name()); + } + } +} diff --git a/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyBuilder.java b/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyBuilder.java index d001ec4049..389e414efa 100644 --- a/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyBuilder.java +++ b/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyBuilder.java @@ -7,27 +7,15 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorUtils; -import io.dapr.client.DaprApiProtocol; -import io.dapr.client.DaprHttpBuilder; -import io.dapr.config.Properties; import io.dapr.serializer.DaprObjectSerializer; import io.dapr.serializer.DefaultObjectSerializer; -import io.dapr.v1.DaprGrpc; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; -import java.io.Closeable; import java.lang.reflect.Proxy; /** * Builder to generate an ActorProxy instance. Builder can be reused for multiple instances. */ -public class ActorProxyBuilder implements Closeable { - - /** - * Determine if this builder will create GRPC clients instead of HTTP clients. - */ - private final DaprApiProtocol apiProtocol; +public class ActorProxyBuilder { /** * Actor's type. @@ -45,36 +33,20 @@ public class ActorProxyBuilder implements Closeable { private DaprObjectSerializer objectSerializer; /** - * Builds Dapr HTTP client. - */ - private DaprHttpBuilder daprHttpBuilder; - - /** - * Channel for communication with Dapr. - */ - private final ManagedChannel channel; - - /** - * Instantiates a new builder for a given Actor type, using {@link DefaultObjectSerializer} by default. - * - * {@link DefaultObjectSerializer} is not recommended for production scenarios. - * - * @param actorTypeClass Actor's type class. + * Client for communication with Dapr's Actor APIs. */ - public ActorProxyBuilder(Class actorTypeClass) { - this(ActorUtils.findActorTypeName(actorTypeClass), actorTypeClass); - } + private final ActorClient actorClient; /** * Instantiates a new builder for a given Actor type, using {@link DefaultObjectSerializer} by default. * * {@link DefaultObjectSerializer} is not recommended for production scenarios. * - * @param actorType Actor's type. * @param actorTypeClass Actor's type class. + * @param actorClient Dapr's sidecar client for Actor APIs. */ - public ActorProxyBuilder(String actorType, Class actorTypeClass) { - this(actorType, actorTypeClass, Properties.API_PROTOCOL.get()); + public ActorProxyBuilder(Class actorTypeClass, ActorClient actorClient) { + this(ActorUtils.findActorTypeName(actorTypeClass), actorTypeClass, actorClient); } /** @@ -84,22 +56,23 @@ public ActorProxyBuilder(String actorType, Class actorTypeClass) { * * @param actorType Actor's type. * @param actorTypeClass Actor's type class. - * @param apiProtocol Dapr's API protocol. + * @param actorClient Dapr's sidecar client for Actor APIs. */ - private ActorProxyBuilder(String actorType, Class actorTypeClass, DaprApiProtocol apiProtocol) { + public ActorProxyBuilder(String actorType, Class actorTypeClass, ActorClient actorClient) { if ((actorType == null) || actorType.isEmpty()) { throw new IllegalArgumentException("ActorType is required."); } if (actorTypeClass == null) { throw new IllegalArgumentException("ActorTypeClass is required."); } + if (actorClient == null) { + throw new IllegalArgumentException("ActorClient is required."); + } - this.apiProtocol = apiProtocol; this.actorType = actorType; this.objectSerializer = new DefaultObjectSerializer(); this.clazz = actorTypeClass; - this.daprHttpBuilder = new DaprHttpBuilder(); - this.channel = buildManagedChannel(apiProtocol); + this.actorClient = actorClient; } /** @@ -132,7 +105,7 @@ public T build(ActorId actorId) { this.actorType, actorId, this.objectSerializer, - buildDaprClient()); + this.actorClient); if (this.clazz.equals(ActorProxy.class)) { // If users want to use the not strongly typed API, we respect that here. @@ -145,46 +118,4 @@ public T build(ActorId actorId) { proxy); } - /** - * Build an instance of the Client based on the provided setup. - * - * @return an instance of the setup Client - * @throws java.lang.IllegalStateException if any required field is missing - */ - private DaprClient buildDaprClient() { - switch (this.apiProtocol) { - case GRPC: return new DaprGrpcClient(DaprGrpc.newFutureStub(this.channel)); - case HTTP: return new DaprHttpClient(daprHttpBuilder.build()); - default: throw new IllegalStateException("Unsupported protocol: " + this.apiProtocol.name()); - } - } - - /** - * {@inheritDoc} - */ - @Override - public void close() { - if (channel != null && !channel.isShutdown()) { - channel.shutdown(); - } - } - - /** - * Creates a GRPC managed channel (or null, if not applicable). - * - * @param apiProtocol Dapr's API protocol. - * @return GRPC managed channel or null. - */ - private static ManagedChannel buildManagedChannel(DaprApiProtocol apiProtocol) { - if (apiProtocol != DaprApiProtocol.GRPC) { - return null; - } - - int port = Properties.GRPC_PORT.get(); - if (port <= 0) { - throw new IllegalArgumentException("Invalid port."); - } - - return ManagedChannelBuilder.forAddress(Properties.SIDECAR_IP.get(), port).usePlaintext().build(); - } } diff --git a/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyImpl.java b/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyImpl.java index 8b97fd7cb5..d17df555c8 100644 --- a/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyImpl.java +++ b/sdk-actors/src/main/java/io/dapr/actors/client/ActorProxyImpl.java @@ -41,7 +41,7 @@ class ActorProxyImpl implements ActorProxy, InvocationHandler { /** * Client to talk to the Dapr's API. */ - private final DaprClient daprClient; + private final ActorClient actorClient; /** * Creates a new instance of {@link ActorProxyImpl}. @@ -49,12 +49,12 @@ class ActorProxyImpl implements ActorProxy, InvocationHandler { * @param actorType actor implementation type of the actor associated with the proxy object. * @param actorId The actorId associated with the proxy * @param serializer Serializer and deserializer for method calls. - * @param daprClient Dapr client. + * @param actorClient Dapr client for Actor APIs. */ - ActorProxyImpl(String actorType, ActorId actorId, DaprObjectSerializer serializer, DaprClient daprClient) { + ActorProxyImpl(String actorType, ActorId actorId, DaprObjectSerializer serializer, ActorClient actorClient) { this.actorType = actorType; this.actorId = actorId; - this.daprClient = daprClient; + this.actorClient = actorClient; this.serializer = serializer; } @@ -77,7 +77,7 @@ public String getActorType() { */ @Override public Mono invokeMethod(String methodName, Object data, TypeRef type) { - return this.daprClient.invoke(actorType, actorId.toString(), methodName, this.serialize(data)) + return this.actorClient.invoke(actorType, actorId.toString(), methodName, this.serialize(data)) .filter(s -> s.length > 0) .map(s -> deserialize(s, type)); } @@ -95,7 +95,7 @@ public Mono invokeMethod(String methodName, Object data, Class clazz) */ @Override public Mono invokeMethod(String methodName, TypeRef type) { - return this.daprClient.invoke(actorType, actorId.toString(), methodName, null) + return this.actorClient.invoke(actorType, actorId.toString(), methodName, null) .filter(s -> s.length > 0) .map(s -> deserialize(s, type)); } @@ -113,7 +113,7 @@ public Mono invokeMethod(String methodName, Class clazz) { */ @Override public Mono invokeMethod(String methodName) { - return this.daprClient.invoke(actorType, actorId.toString(), methodName, null).then(); + return this.actorClient.invoke(actorType, actorId.toString(), methodName, null).then(); } /** @@ -121,7 +121,7 @@ public Mono invokeMethod(String methodName) { */ @Override public Mono invokeMethod(String methodName, Object data) { - return this.daprClient.invoke(actorType, actorId.toString(), methodName, this.serialize(data)).then(); + return this.actorClient.invoke(actorType, actorId.toString(), methodName, this.serialize(data)).then(); } /** diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java index be8df06378..b53efeca30 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java @@ -7,43 +7,56 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorType; +import org.junit.AfterClass; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; public class ActorProxyBuilderTest { + private static ActorClient actorClient; + + @BeforeClass + public static void initClass() { + actorClient = new ActorClient(); + } + + @AfterClass + public static void tearDownClass() { + actorClient.close(); + } + @Test(expected = IllegalArgumentException.class) public void buildWithNullActorId() { - new ActorProxyBuilder("test", Object.class) + new ActorProxyBuilder("test", Object.class, actorClient) .build(null); - } @Test(expected = IllegalArgumentException.class) public void buildWithEmptyActorType() { - new ActorProxyBuilder("", Object.class) - .build(new ActorId("100")); - + new ActorProxyBuilder("", Object.class, actorClient); } @Test(expected = IllegalArgumentException.class) public void buildWithNullActorType() { - new ActorProxyBuilder(null, Object.class) - .build(new ActorId("100")); - + new ActorProxyBuilder(null, Object.class, actorClient); } @Test(expected = IllegalArgumentException.class) public void buildWithNullSerializer() { - new ActorProxyBuilder("MyActor", Object.class) + new ActorProxyBuilder("MyActor", Object.class, actorClient) .withObjectSerializer(null) .build(new ActorId("100")); + } + @Test(expected = IllegalArgumentException.class) + public void buildWithNullClient() { + new ActorProxyBuilder("MyActor", Object.class, null); } @Test() public void build() { - ActorProxyBuilder builder = new ActorProxyBuilder("test", ActorProxy.class); + ActorProxyBuilder builder = new ActorProxyBuilder("test", ActorProxy.class, actorClient); ActorProxy actorProxy = builder.build(new ActorId("100")); Assert.assertNotNull(actorProxy); @@ -53,7 +66,7 @@ public void build() { @Test() public void buildWithType() { - ActorProxyBuilder builder = new ActorProxyBuilder(MyActor.class); + ActorProxyBuilder builder = new ActorProxyBuilder(MyActor.class, actorClient); MyActor actorProxy = builder.build(new ActorId("100")); Assert.assertNotNull(actorProxy); @@ -61,8 +74,8 @@ public void buildWithType() { @Test() public void buildWithTypeDefaultName() { - ActorProxyBuilder builder = new ActorProxyBuilder(MyActorWithDefaultName.class); - MyActorWithDefaultName actorProxy = builder.build(new ActorId("100")); + ActorProxyBuilder builder = new ActorProxyBuilder(ActorWithDefaultName.class, actorClient); + ActorWithDefaultName actorProxy = builder.build(new ActorId("100")); Assert.assertNotNull(actorProxy); } @@ -71,6 +84,7 @@ public void buildWithTypeDefaultName() { public interface MyActor { } - public interface MyActorWithDefaultName { + public interface ActorWithDefaultName { } -} \ No newline at end of file + +} diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyForTestsImpl.java b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyForTestsImpl.java deleted file mode 100644 index faa237136a..0000000000 --- a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyForTestsImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - */ - -package io.dapr.actors.client; - -import io.dapr.actors.ActorId; -import io.dapr.serializer.DaprObjectSerializer; - -public class ActorProxyForTestsImpl extends ActorProxyImpl { - - public ActorProxyForTestsImpl(String actorType, ActorId actorId, DaprObjectSerializer serializer, DaprClient daprClient) { - super(actorType, actorId, serializer, daprClient); - } -} diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplForTests.java b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplForTests.java new file mode 100644 index 0000000000..a5160ace2a --- /dev/null +++ b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplForTests.java @@ -0,0 +1,16 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + */ + +package io.dapr.actors.client; + +import io.dapr.actors.ActorId; +import io.dapr.serializer.DaprObjectSerializer; + +public class ActorProxyImplForTests extends ActorProxyImpl { + + public ActorProxyImplForTests(String actorType, ActorId actorId, DaprObjectSerializer serializer, ActorClient actorClient) { + super(actorType, actorId, serializer, actorClient); + } +} diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java index d6cf4ce097..d9b867fbc1 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java @@ -23,7 +23,7 @@ public class ActorProxyImplTest { @Test() public void constructorActorProxyTest() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); final DaprObjectSerializer serializer = mock(DaprObjectSerializer.class); final ActorProxyImpl actorProxy = new ActorProxyImpl( "myActorType", @@ -36,7 +36,7 @@ public void constructorActorProxyTest() { @Test() public void invokeActorMethodWithoutDataWithReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.just( "{\n\t\t\"propertyA\": \"valueA\",\n\t\t\"propertyB\": \"valueB\"\n\t}".getBytes()); @@ -58,7 +58,7 @@ public void invokeActorMethodWithoutDataWithReturnType() { @Test() public void invokeActorMethodWithoutDataWithReturnTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.just( "{\n\t\t\"propertyA\": \"valueA\",\n\t\t\"propertyB\": \"valueB\"\n\t}".getBytes()); @@ -79,7 +79,7 @@ public void invokeActorMethodWithoutDataWithReturnTypeViaReflection() throws NoS @Test() public void invokeActorMethodWithoutDataWithReturnMonoTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.just( "{\n\t\t\"propertyA\": \"valueA\",\n\t\t\"propertyB\": \"valueB\"\n\t}".getBytes()); @@ -102,7 +102,7 @@ public void invokeActorMethodWithoutDataWithReturnMonoTypeViaReflection() throws @Test() public void invokeActorMethodWithDataWithReturnTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.just( "\"OK\"".getBytes()); @@ -125,7 +125,7 @@ public void invokeActorMethodWithDataWithReturnTypeViaReflection() throws NoSuch @Test() public void invokeActorMethodWithDataWithReturnMonoTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.just( "\"OK\"".getBytes()); @@ -149,7 +149,7 @@ public void invokeActorMethodWithDataWithReturnMonoTypeViaReflection() throws No @Test() public void invokeActorMethodWithoutDataWithoutReturnTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.empty(); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNull())) @@ -167,7 +167,7 @@ public void invokeActorMethodWithoutDataWithoutReturnTypeViaReflection() throws @Test() public void invokeActorMethodWithoutDataWithoutReturnTypeMonoViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.empty(); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNull())) @@ -186,7 +186,7 @@ public void invokeActorMethodWithoutDataWithoutReturnTypeMonoViaReflection() thr @Test() public void invokeActorMethodWithDataWithoutReturnTypeMonoViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.empty(); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.eq("\"hello world\"".getBytes()))) @@ -209,7 +209,7 @@ public void invokeActorMethodWithDataWithoutReturnTypeMonoViaReflection() throws @Test(expected = UnsupportedOperationException.class) public void invokeActorMethodWithTooManyArgsViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); final ActorProxyImpl actorProxy = new ActorProxyImpl( "myActorType", @@ -228,7 +228,7 @@ public void invokeActorMethodWithTooManyArgsViaReflection() throws NoSuchMethodE @Test() public void invokeActorMethodWithDataWithoutReturnTypeViaReflection() throws NoSuchMethodException { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); Mono daprResponse = Mono.empty(); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.eq("\"hello world\"".getBytes()))) @@ -250,7 +250,7 @@ public void invokeActorMethodWithDataWithoutReturnTypeViaReflection() throws NoS @Test() public void invokeActorMethodWithoutDataWithEmptyReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNull())) .thenReturn(Mono.just("".getBytes())); @@ -267,7 +267,7 @@ public void invokeActorMethodWithoutDataWithEmptyReturnType() { @Test(expected = RuntimeException.class) public void invokeActorMethodWithIncorrectReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNull())) .thenReturn(Mono.just("{test}".getBytes())); @@ -287,7 +287,7 @@ public void invokeActorMethodWithIncorrectReturnType() { @Test() public void invokeActorMethodSavingDataWithReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn( Mono.just("{\n\t\t\"propertyA\": \"valueA\",\n\t\t\"propertyB\": \"valueB\"\n\t}".getBytes())); @@ -312,7 +312,7 @@ public void invokeActorMethodSavingDataWithReturnType() { @Test(expected = DaprException.class) public void invokeActorMethodSavingDataWithIncorrectReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn(Mono.just("{test}".getBytes())); @@ -336,7 +336,7 @@ public void invokeActorMethodSavingDataWithIncorrectReturnType() { @Test() public void invokeActorMethodSavingDataWithEmptyReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn(Mono.just("".getBytes())); @@ -358,7 +358,7 @@ public void invokeActorMethodSavingDataWithEmptyReturnType() { @Test(expected = DaprException.class) public void invokeActorMethodSavingDataWithIncorrectInputType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn(Mono.just("{test}".getBytes())); @@ -387,7 +387,7 @@ public void invokeActorMethodWithDataWithVoidReturnType() { saveData.setPropertyA("valueA"); saveData.setPropertyB("valueB"); - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn(Mono.empty()); @@ -410,7 +410,7 @@ public void invokeActorMethodWithDataWithVoidIncorrectInputType() { saveData.setPropertyB("valueB"); saveData.setMyData(saveData); - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNotNull())) .thenReturn(Mono.empty()); @@ -427,7 +427,7 @@ public void invokeActorMethodWithDataWithVoidIncorrectInputType() { @Test() public void invokeActorMethodWithoutDataWithVoidReturnType() { - final DaprClient daprClient = mock(DaprClient.class); + final ActorClient daprClient = mock(ActorClient.class); when(daprClient.invoke(anyString(), anyString(), anyString(), Mockito.isNull())) .thenReturn(Mono.empty()); diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/DaprClientStub.java b/sdk-actors/src/test/java/io/dapr/actors/client/DaprClientStub.java index 7bff09f046..9e7f668423 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/client/DaprClientStub.java +++ b/sdk-actors/src/test/java/io/dapr/actors/client/DaprClientStub.java @@ -7,7 +7,7 @@ import reactor.core.publisher.Mono; -public class DaprClientStub implements DaprClient { +public class DaprClientStub extends ActorClient implements DaprClient { @Override public Mono invoke(String actorType, String actorId, String methodName, byte[] jsonPayload) { diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorCustomSerializerTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorCustomSerializerTest.java index 2a53723595..608374acc5 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorCustomSerializerTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorCustomSerializerTest.java @@ -8,7 +8,7 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorType; import io.dapr.actors.client.ActorProxy; -import io.dapr.actors.client.ActorProxyForTestsImpl; +import io.dapr.actors.client.ActorProxyImplForTests; import io.dapr.actors.client.DaprClientStub; import io.dapr.serializer.DaprObjectSerializer; import org.junit.Assert; @@ -143,7 +143,7 @@ private ActorProxy createActorProxy() { this.manager.activateActor(actorId).block(); - return new ActorProxyForTestsImpl( + return new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, CUSTOM_SERIALIZER, diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorNoStateTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorNoStateTest.java index 2b01ea93bb..c7e7fc66fe 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorNoStateTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorNoStateTest.java @@ -9,7 +9,7 @@ import io.dapr.actors.ActorMethod; import io.dapr.actors.ActorType; import io.dapr.actors.client.ActorProxy; -import io.dapr.actors.client.ActorProxyForTestsImpl; +import io.dapr.actors.client.ActorProxyImplForTests; import io.dapr.actors.client.DaprClientStub; import io.dapr.serializer.DefaultObjectSerializer; import org.junit.Assert; @@ -245,7 +245,7 @@ private ActorProxy createActorProxy() { this.manager.activateActor(actorId).block(); - return new ActorProxyForTestsImpl( + return new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, new DefaultObjectSerializer(), @@ -271,13 +271,13 @@ private T createActorProxy(Class clazz) { this.manager.activateActor(actorId).block(); - ActorProxyForTestsImpl proxy = new ActorProxyForTestsImpl( + ActorProxyImplForTests proxy = new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, new DefaultObjectSerializer(), daprClient); return (T) Proxy.newProxyInstance( - ActorProxyForTestsImpl.class.getClassLoader(), + ActorProxyImplForTests.class.getClassLoader(), new Class[]{clazz}, proxy); } diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorStatefulTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorStatefulTest.java index cd477a50cc..7b43c0bfe1 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorStatefulTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/ActorStatefulTest.java @@ -8,7 +8,7 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorType; import io.dapr.actors.client.ActorProxy; -import io.dapr.actors.client.ActorProxyForTestsImpl; +import io.dapr.actors.client.ActorProxyImplForTests; import io.dapr.actors.client.DaprClientStub; import io.dapr.serializer.DefaultObjectSerializer; import io.dapr.utils.TypeRef; @@ -620,7 +620,7 @@ private ActorProxy newActorProxy() { this.manager.activateActor(actorId).block(); - return new ActorProxyForTestsImpl( + return new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, new DefaultObjectSerializer(), diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/DerivedActorTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/DerivedActorTest.java index 09d377b314..ad46016dd0 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/DerivedActorTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/DerivedActorTest.java @@ -8,7 +8,7 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorType; import io.dapr.actors.client.ActorProxy; -import io.dapr.actors.client.ActorProxyForTestsImpl; +import io.dapr.actors.client.ActorProxyImplForTests; import io.dapr.actors.client.DaprClientStub; import io.dapr.serializer.DefaultObjectSerializer; import org.junit.Assert; @@ -340,7 +340,7 @@ private ActorProxy createActorProxyForActorChild() { this.manager.activateActor(actorId).block(); - return new ActorProxyForTestsImpl( + return new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, new DefaultObjectSerializer(), diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/ThrowFromPreAndPostActorMethodsTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/ThrowFromPreAndPostActorMethodsTest.java index dbd3c3c45f..5dbb1e9380 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/ThrowFromPreAndPostActorMethodsTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/ThrowFromPreAndPostActorMethodsTest.java @@ -8,7 +8,7 @@ import io.dapr.actors.ActorId; import io.dapr.actors.ActorType; import io.dapr.actors.client.ActorProxy; -import io.dapr.actors.client.ActorProxyForTestsImpl; +import io.dapr.actors.client.ActorProxyImplForTests; import io.dapr.actors.client.DaprClientStub; import io.dapr.serializer.DefaultObjectSerializer; import org.junit.Assert; @@ -159,7 +159,7 @@ private ActorProxy createActorProxyForActorChild() { this.manager.activateActor(actorId).block(); - return new ActorProxyForTestsImpl( + return new ActorProxyImplForTests( context.getActorTypeInformation().getName(), actorId, new DefaultObjectSerializer(), diff --git a/sdk-tests/src/test/java/io/dapr/it/BaseIT.java b/sdk-tests/src/test/java/io/dapr/it/BaseIT.java index 1e8f146e4b..5ce0c6ce90 100644 --- a/sdk-tests/src/test/java/io/dapr/it/BaseIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/BaseIT.java @@ -5,11 +5,11 @@ package io.dapr.it; +import io.dapr.actors.client.ActorClient; import io.dapr.client.DaprApiProtocol; import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.AfterClass; -import java.io.Closeable; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; @@ -23,7 +23,7 @@ public abstract class BaseIT { private static final Queue TO_BE_STOPPED = new LinkedList<>(); - private static final Queue TO_BE_CLOSED = new LinkedList<>(); + private static final Queue TO_BE_CLOSED = new LinkedList<>(); protected static DaprRun startDaprApp( String testName, @@ -109,18 +109,17 @@ protected static ImmutablePair startSplitDaprAndApp( @AfterClass public static void cleanUp() throws Exception { while (!TO_BE_CLOSED.isEmpty()) { - Closeable toBeClosed = TO_BE_CLOSED.remove(); - toBeClosed.close(); + TO_BE_CLOSED.remove().close(); } while (!TO_BE_STOPPED.isEmpty()) { - Stoppable toBeStopped = TO_BE_STOPPED.remove(); - toBeStopped.stop(); + TO_BE_STOPPED.remove().stop(); } } - protected static T deferClose(T closeable) { - TO_BE_CLOSED.add(closeable); - return closeable; + protected ActorClient newActorClient() { + ActorClient client = new ActorClient(); + TO_BE_CLOSED.add(client); + return client; } } diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActivationDeactivationIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActivationDeactivationIT.java index 2641672bc7..8c7b84a98c 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActivationDeactivationIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActivationDeactivationIT.java @@ -38,7 +38,7 @@ public void activateInvokeDeactivate() throws Exception { final AtomicInteger atomicInteger = new AtomicInteger(1); logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(DemoActor.class)); + ActorProxyBuilder proxyBuilder = new ActorProxyBuilder(DemoActor.class, newActorClient()); logger.debug("Creating actorId"); ActorId actorId1 = new ActorId(Integer.toString(atomicInteger.getAndIncrement())); logger.debug("Building proxy"); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorMethodNameIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorMethodNameIT.java index 70071b5724..ef1de2e431 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorMethodNameIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorMethodNameIT.java @@ -33,7 +33,8 @@ public void actorMethodNameChange() throws Exception { 60000); logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder("MyActorTest", MyActor.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder("MyActorTest", MyActor.class, newActorClient()); logger.debug("Creating actorId"); ActorId actorId1 = new ActorId("1"); logger.debug("Building proxy"); @@ -47,7 +48,8 @@ public void actorMethodNameChange() throws Exception { }, 60000); logger.debug("Creating proxy builder 2"); - ActorProxyBuilder proxyBuilder2 = deferClose(new ActorProxyBuilder("MyActorTest", ActorProxy.class)); + ActorProxyBuilder proxyBuilder2 = + new ActorProxyBuilder("MyActorTest", ActorProxy.class, newActorClient()); logger.debug("Building proxy 2"); ActorProxy proxy2 = proxyBuilder2.build(actorId1); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderFailoverIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderFailoverIT.java index acc56b140a..42be26431c 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderFailoverIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderFailoverIT.java @@ -63,7 +63,8 @@ public void init() throws Exception { String actorType="MyActorTest"; logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); logger.debug("Creating actorId"); logger.debug("Building proxy"); proxy = proxyBuilder.build(actorId); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java index 8989160bc7..504b6876ec 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java @@ -51,7 +51,8 @@ public void init() throws Exception { String actorType="MyActorTest"; logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); logger.debug("Creating actorId"); logger.debug("Building proxy"); proxy = proxyBuilder.build(actorId); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorStateIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorStateIT.java index 60fc74abae..5d152fe325 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorStateIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorStateIT.java @@ -74,7 +74,8 @@ public void writeReadState() throws Exception { String.format("%d-%b-%b", System.currentTimeMillis(), this.daprClientProtocol, this.serviceAppProtocol)); String actorType = "StatefulActorTest"; logger.debug("Building proxy ..."); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); ActorProxy proxy = proxyBuilder.build(actorId); // Validate conditional read works. @@ -160,7 +161,7 @@ public void writeReadState() throws Exception { runtime.switchToProtocol(this.daprClientProtocol); // Need new proxy builder because the proxy builder holds the channel. - proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + proxyBuilder = new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); ActorProxy newProxy = proxyBuilder.build(actorId); callWithRetry(() -> { diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java index 0de9292804..09f8ffea42 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java @@ -47,7 +47,8 @@ public void timerRecoveryTest() throws Exception { String actorType="MyActorTest"; logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); logger.debug("Creating actorId"); ActorId actorId = new ActorId(UUID.randomUUID().toString()); logger.debug("Building proxy"); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTurnBasedConcurrencyIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTurnBasedConcurrencyIT.java index 9597605e26..7cb19d3d76 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTurnBasedConcurrencyIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTurnBasedConcurrencyIT.java @@ -80,7 +80,8 @@ public void actorTest1() throws Exception { String actorType="MyActorTest"; logger.debug("Creating proxy builder"); - ActorProxyBuilder proxyBuilder = deferClose(new ActorProxyBuilder(actorType, ActorProxy.class)); + ActorProxyBuilder proxyBuilder = + new ActorProxyBuilder(actorType, ActorProxy.class, newActorClient()); logger.debug("Creating actorId"); ActorId actorId1 = new ActorId(ACTOR_ID); logger.debug("Building proxy"); diff --git a/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java b/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java index 40013add96..8d53490607 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java @@ -26,26 +26,6 @@ public class DaprHttpBuilder { */ private static final Object LOCK = new Object(); - /** - * Read timeout used to build object. - */ - private Duration readTimeout = Duration.ofSeconds(Properties.HTTP_CLIENT_READ_TIMEOUT_SECONDS.get()); - - /** - * Sets the read timeout duration for the instance to be built. - * - *

Instead, set environment variable "DAPR_HTTP_CLIENT_READTIMEOUTSECONDS", - * or system property "dapr.http.client.readtimeoutseconds". - * - * @param duration Read timeout duration. - * @return Same builder instance. - */ - @Deprecated - public DaprHttpBuilder withReadTimeout(Duration duration) { - this.readTimeout = duration; - return this; - } - /** * Build an instance of the Http client based on the provided setup. * @@ -57,7 +37,7 @@ public DaprHttp build() { } /** - * Creates and instance of the HTTP Client. + * Creates an instance of the HTTP Client. * * @return Instance of {@link DaprHttp} */ @@ -66,7 +46,8 @@ private DaprHttp buildDaprHttp() { synchronized (LOCK) { if (OK_HTTP_CLIENT.get() == null) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.readTimeout(this.readTimeout); + Duration readTimeout = Duration.ofSeconds(Properties.HTTP_CLIENT_READ_TIMEOUT_SECONDS.get()); + builder.readTimeout(readTimeout); OkHttpClient okHttpClient = builder.build(); OK_HTTP_CLIENT.set(okHttpClient); }