diff --git a/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitEventSourcedEntityContext.scala b/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitEventSourcedEntityContext.scala index c9219a2772..20da10417e 100644 --- a/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitEventSourcedEntityContext.scala +++ b/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitEventSourcedEntityContext.scala @@ -26,8 +26,6 @@ import com.akkaserverless.javasdk.eventsourcedentity.EventSourcedEntityContext */ final class TestKitEventSourcedEntityContext(override val entityId: String) extends EventSourcedEntityContext { override def serviceCallFactory: ServiceCallFactory = TestKitServiceCallFactory - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - throw new UnsupportedOperationException("Testing logic using a gRPC client is not possible with the testkit") override def materializer(): Materializer = throw new UnsupportedOperationException( "Accessing the materializer from testkit not supported yet") } diff --git a/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitValueEntityContext.scala b/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitValueEntityContext.scala index b75a91ee95..3345586c2d 100644 --- a/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitValueEntityContext.scala +++ b/sdk/java-sdk-testkit/src/main/scala/com/akkaserverless/javasdk/testkit/impl/TestKitValueEntityContext.scala @@ -25,8 +25,6 @@ import com.akkaserverless.javasdk.valueentity.ValueEntityContext */ final class TestKitValueEntityContext(override val entityId: String) extends ValueEntityContext { override def serviceCallFactory: ServiceCallFactory = TestKitServiceCallFactory - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - throw new UnsupportedOperationException("Testing logic using a gRPC client is not possible with the testkit") override def materializer(): Materializer = throw new UnsupportedOperationException( "Accessing the materializer from testkit not supported yet") } diff --git a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/Context.java b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/Context.java index 2a7d2c1bef..51a394f2b2 100644 --- a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/Context.java +++ b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/Context.java @@ -23,19 +23,6 @@ public interface Context { /** Get the service call factory for this stateful service. */ ServiceCallFactory serviceCallFactory(); - /** - * Get an Akka gRPC client for the given service name. The same client instance is shared across - * components in the application. The lifecycle of the client is managed by the SDK and it should - * not be stopped by user code. - * - * @param The "service" interface generated for the service by Akka gRPC - * @param clientClass The class of a gRPC service generated by Akka gRPC - * @param service The name of the service to connect to, either a name of another Akka Serverless - * service or an external service where connection details are configured under - * `akka.grpc.client.[service-name]` in `application.conf`. - */ - T getGrpcClient(Class clientClass, String service); - /** * An Akka Stream materializer to use for running streams. Needed for example in a command handler * which accepts streaming elements but returns a single async reply once all streamed elements diff --git a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionContext.java b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionContext.java index 2a8fba48cd..0b66736a85 100644 --- a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionContext.java +++ b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionContext.java @@ -45,4 +45,17 @@ public interface ActionContext extends MetadataContext { * emitted from an entity. */ Optional eventSubject(); + + /** + * Get an Akka gRPC client for the given service name. The same client instance is shared across + * components in the application. The lifecycle of the client is managed by the SDK and it should + * not be stopped by user code. + * + * @param The "service" interface generated for the service by Akka gRPC + * @param clientClass The class of a gRPC service generated by Akka gRPC + * @param service The name of the service to connect to, either a name of another Akka Serverless + * service or an external service where connection details are configured under + * `akka.grpc.client.[service-name]` in `application.conf`. + */ + T getGrpcClient(Class clientClass, String service); } diff --git a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionCreationContext.java b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionCreationContext.java index 3b89aa5122..db478da7ce 100644 --- a/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionCreationContext.java +++ b/sdk/java-sdk/src/main/java/com/akkaserverless/javasdk/action/ActionCreationContext.java @@ -23,4 +23,17 @@ * *

This may be accepted as an argument to the constructor of an Action. */ -public interface ActionCreationContext extends Context {} +public interface ActionCreationContext extends Context { + /** + * Get an Akka gRPC client for the given service name. The same client instance is shared across + * components in the application. The lifecycle of the client is managed by the SDK and it should + * not be stopped by user code. + * + * @param The "service" interface generated for the service by Akka gRPC + * @param clientClass The class of a gRPC service generated by Akka gRPC + * @param service The name of the service to connect to, either a name of another Akka Serverless + * service or an external service where connection details are configured under + * `akka.grpc.client.[service-name]` in `application.conf`. + */ + T getGrpcClient(Class clientClass, String service); +} diff --git a/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/Contexts.scala b/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/Contexts.scala index baf30a8a29..59a25ab57b 100644 --- a/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/Contexts.scala +++ b/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/Contexts.scala @@ -38,8 +38,6 @@ private[javasdk] abstract class AbstractContext( override val serviceCallFactory: ServiceCallFactory, system: ActorSystem) extends Context { - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - GrpcClients(system).getGrpcClient(clientClass, service) override def materializer(): Materializer = SystemMaterializer(system).materializer diff --git a/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/action/ActionsImpl.scala b/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/action/ActionsImpl.scala index 29fa6957af..01a74c3223 100644 --- a/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/action/ActionsImpl.scala +++ b/sdk/java-sdk/src/main/scala/com/akkaserverless/javasdk/impl/action/ActionsImpl.scala @@ -101,7 +101,10 @@ private[javasdk] final class ActionsImpl( private object creationContext extends AbstractContext(rootContext.serviceCallFactory(), system) - with ActionCreationContext + with ActionCreationContext { + override def getGrpcClient[T](clientClass: Class[T], service: String): T = + GrpcClients(system).getGrpcClient(clientClass, service) + } private def toJavaPbAny(any: Option[ScalaPbAny]) = any.fold(JavaPbAny.getDefaultInstance)(ScalaPbAny.toJavaProto) @@ -329,7 +332,11 @@ private[javasdk] final class ActionsImpl( metadata.asCloudEvent().subject() else Optional.empty() + + override def getGrpcClient[T](clientClass: Class[T], service: String): T = + GrpcClients(system).getGrpcClient(clientClass, service) } + } case class MessageEnvelopeImpl[T](payload: T, metadata: Metadata) extends MessageEnvelope[T] diff --git a/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitEventSourcedEntityContext.scala b/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitEventSourcedEntityContext.scala index e9422b8b0f..617cb3d9e0 100644 --- a/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitEventSourcedEntityContext.scala +++ b/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitEventSourcedEntityContext.scala @@ -25,8 +25,6 @@ import com.akkaserverless.scalasdk.eventsourcedentity.EventSourcedEntityContext */ final class TestKitEventSourcedEntityContext(override val entityId: String) extends EventSourcedEntityContext { override def serviceCallFactory: ServiceCallFactory = TestKitServiceCallFactory - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - throw new UnsupportedOperationException("Testing logic using a gRPC client is not possible with the testkit") override def materializer(): Materializer = throw new UnsupportedOperationException( "Accessing the materializer from testkit not supported yet") } diff --git a/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitValueEntityContext.scala b/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitValueEntityContext.scala index a099c86062..f24cb636e3 100644 --- a/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitValueEntityContext.scala +++ b/sdk/scala-sdk-testkit/src/main/scala/com/akkaserverless/scalasdk/testkit/impl/TestKitValueEntityContext.scala @@ -25,8 +25,6 @@ import com.akkaserverless.scalasdk.valueentity.ValueEntityContext */ final class TestKitValueEntityContext(override val entityId: String) extends ValueEntityContext { override def serviceCallFactory: ServiceCallFactory = TestKitServiceCallFactory - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - throw new UnsupportedOperationException("Testing logic using a gRPC client is not possible with the testkit") override def materializer(): Materializer = throw new UnsupportedOperationException( "Accessing the materializer from testkit not supported yet") } diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/Context.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/Context.scala index ac812b2fff..85bba4079c 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/Context.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/Context.scala @@ -23,20 +23,6 @@ trait Context { /** Get the service call factory for this stateful service. */ def serviceCallFactory: ServiceCallFactory - /** - * Get an Akka gRPC client for the given service name. The same client instance is shared across components in the - * application. The lifecycle of the client is managed by the SDK and it should not be stopped by user code. - * - * @tparam T - * The "service" interface generated for the service by Akka gRPC - * @param clientClass - * The class of a gRPC service generated by Akka gRPC - * @param service - * The name of the service to connect to, either a name of another Akka Serverless service or an external service - * where connection details are configured under `akka.grpc.client.[service-name]` in `application.conf`. - */ - def getGrpcClient[T](clientClass: Class[T], service: String): T - /** * An Akka Stream materializer to use for running streams. Needed for example in a command handler which accepts * streaming elements but returns a single async reply once all streamed elements has been consumed. diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionContext.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionContext.scala index 2296b8a585..44743914db 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionContext.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionContext.scala @@ -37,4 +37,18 @@ trait ActionContext extends MetadataContext { * The origin subject of the {{{CloudEvent}}}. For example, the entity key when the event was emitted from an entity. */ def eventSubject: Option[String] + + /** + * Get an Akka gRPC client for the given service name. The same client instance is shared across components in the + * application. The lifecycle of the client is managed by the SDK and it should not be stopped by user code. + * + * @tparam T + * The "service" interface generated for the service by Akka gRPC + * @param clientClass + * The class of a gRPC service generated by Akka gRPC + * @param service + * The name of the service to connect to, either a name of another Akka Serverless service or an external service + * where connection details are configured under `akka.grpc.client.[service-name]` in `application.conf`. + */ + def getGrpcClient[T](clientClass: Class[T], service: String): T } diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionCreationContext.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionCreationContext.scala index 593d542a16..ea35236c91 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionCreationContext.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/action/ActionCreationContext.scala @@ -18,4 +18,19 @@ package com.akkaserverless.scalasdk.action import com.akkaserverless.scalasdk.Context -trait ActionCreationContext extends Context {} +trait ActionCreationContext extends Context { + + /** + * Get an Akka gRPC client for the given service name. The same client instance is shared across components in the + * application. The lifecycle of the client is managed by the SDK and it should not be stopped by user code. + * + * @tparam T + * The "service" interface generated for the service by Akka gRPC + * @param clientClass + * The class of a gRPC service generated by Akka gRPC + * @param service + * The name of the service to connect to, either a name of another Akka Serverless service or an external service + * where connection details are configured under `akka.grpc.client.[service-name]` in `application.conf`. + */ + def getGrpcClient[T](clientClass: Class[T], service: String): T +} diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/eventsourcedentity/EventSourcedEntityAdapters.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/eventsourcedentity/EventSourcedEntityAdapters.scala index da40dd2826..9a74a9b657 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/eventsourcedentity/EventSourcedEntityAdapters.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/eventsourcedentity/EventSourcedEntityAdapters.scala @@ -18,7 +18,6 @@ package com.akkaserverless.scalasdk.impl.eventsourcedentity import java.util.Optional import scala.collection.immutable -import scala.compat.java8.DurationConverters._ import scala.jdk.CollectionConverters.SetHasAsJava import scala.jdk.CollectionConverters.SetHasAsScala import scala.jdk.OptionConverters._ @@ -39,9 +38,7 @@ import com.akkaserverless.scalasdk.eventsourcedentity.EventSourcedEntity import com.akkaserverless.scalasdk.eventsourcedentity.EventSourcedEntityOptions import com.akkaserverless.scalasdk.eventsourcedentity.EventSourcedEntityContext import com.akkaserverless.scalasdk.eventsourcedentity.EventSourcedEntityProvider -import com.akkaserverless.scalasdk.PassivationStrategy import com.akkaserverless.scalasdk.ServiceCallFactory -import com.akkaserverless.scalasdk.impl.MetadataImpl import com.akkaserverless.scalasdk.impl.MetadataConverters import com.akkaserverless.scalasdk.impl.PassivationStrategyConverters import com.akkaserverless.scalasdk.impl.ScalaServiceCallFactoryAdapter @@ -131,9 +128,6 @@ private[scalasdk] final class ScalaEventSourcedEntityContextAdapter(javasdkConte def entityId: String = javasdkContext.entityId() - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javasdkContext.getGrpcClient(clientClass, service) - override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javasdkContext.serviceCallFactory()) @@ -143,15 +137,12 @@ private[scalasdk] final class ScalaEventSourcedEntityContextAdapter(javasdkConte private[scalasdk] final class JavaCommandContextAdapter(val javasdkContext: JavaSdkCommandContext) extends CommandContext { - override def sequenceNumber = javasdkContext.sequenceNumber() + override def sequenceNumber: Long = javasdkContext.sequenceNumber() override def commandName: String = javasdkContext.commandName() override def commandId: Long = javasdkContext.commandId() - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javasdkContext.getGrpcClient(clientClass, service) - override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javasdkContext.serviceCallFactory()) @@ -164,10 +155,7 @@ private[scalasdk] final class JavaCommandContextAdapter(val javasdkContext: Java } private[scalasdk] final class JavaEventContextAdapter(val javasdkContext: JavaSdkEventContext) extends EventContext { - override def sequenceNumber = javasdkContext.sequenceNumber() - - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javasdkContext.getGrpcClient(clientClass, service) + override def sequenceNumber: Long = javasdkContext.sequenceNumber() override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javasdkContext.serviceCallFactory()) diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/valueentity/ValueEntityAdapters.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/valueentity/ValueEntityAdapters.scala index 90d6495744..a52a42e0c6 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/valueentity/ValueEntityAdapters.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/valueentity/ValueEntityAdapters.scala @@ -27,7 +27,6 @@ import akka.stream.Materializer import com.akkaserverless.javasdk import com.akkaserverless.scalasdk.ServiceCallFactory import com.akkaserverless.scalasdk.impl.MetadataConverters -import com.akkaserverless.scalasdk.impl.MetadataImpl import com.akkaserverless.scalasdk.impl.PassivationStrategyConverters import com.akkaserverless.scalasdk.impl.ScalaServiceCallFactoryAdapter import com.akkaserverless.scalasdk.valueentity.CommandContext @@ -112,9 +111,6 @@ private[scalasdk] final class ScalaCommandContextAdapter(val javaSdkContext: jav override def commandId: Long = javaSdkContext.commandId() - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkContext.getGrpcClient(clientClass, service) - override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javaSdkContext.serviceCallFactory()) @@ -131,9 +127,6 @@ private[scalasdk] final class ScalaValueEntityContextAdapter(javaSdkContext: jav def entityId: String = javaSdkContext.entityId() - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkContext.getGrpcClient(clientClass, service) - override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javaSdkContext.serviceCallFactory()) diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/view/ViewAdapters.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/view/ViewAdapters.scala index 141ac2e771..cf20134da8 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/view/ViewAdapters.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/impl/view/ViewAdapters.scala @@ -27,7 +27,6 @@ import com.akkaserverless.javasdk.view.ViewOptions import com.akkaserverless.scalasdk.Metadata import com.akkaserverless.scalasdk.ServiceCallFactory import com.akkaserverless.scalasdk.impl.MetadataConverters -import com.akkaserverless.scalasdk.impl.MetadataImpl import com.akkaserverless.scalasdk.impl.ScalaServiceCallFactoryAdapter import com.akkaserverless.scalasdk.view.UpdateContext import com.akkaserverless.scalasdk.view.View @@ -85,9 +84,6 @@ private[scalasdk] final class ScalaViewCreationContextAdapter(javaSdkContext: ja override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javaSdkContext.serviceCallFactory()) - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkContext.getGrpcClient(clientClass, service) - override def materializer(): Materializer = javaSdkContext.materializer() } @@ -108,8 +104,5 @@ private[scalasdk] final class ScalaUpdateContextAdapter(val javaSdkContext: java override def viewId: String = javaSdkContext.viewId() - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkContext.getGrpcClient(clientClass, service) - override def materializer(): Materializer = javaSdkContext.materializer() } diff --git a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/replicatedentity/ReplicatedEntityAdapters.scala b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/replicatedentity/ReplicatedEntityAdapters.scala index c29696dd05..82aebc9a07 100644 --- a/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/replicatedentity/ReplicatedEntityAdapters.scala +++ b/sdk/scala-sdk/src/main/scala/com/akkaserverless/scalasdk/replicatedentity/ReplicatedEntityAdapters.scala @@ -141,9 +141,6 @@ private[scalasdk] final case class ScalaCommandContextAdapter(javaSdkCommandCont override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter(javaSdkCommandContext.serviceCallFactory()) - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkCommandContext.getGrpcClient(clientClass, service) - override def materializer(): Materializer = javaSdkCommandContext.materializer() @@ -157,9 +154,6 @@ private[scalasdk] final case class ScalaReplicatedEntityContextAdapter(javaSdkCo override def serviceCallFactory: ServiceCallFactory = ScalaServiceCallFactoryAdapter( javaSdkContext.serviceCallFactory()) - override def getGrpcClient[T](clientClass: Class[T], service: String): T = - javaSdkContext.getGrpcClient(clientClass, service) - override def materializer(): Materializer = javaSdkContext.materializer() }