Dapr SDK for Java
Go to file
Artur Souza 7f76d5b2de
Integration test stabilization + update proto and Dapr runtime to 1.12 RC. (#917)
* Update Dapr runtime to 1.12 RC.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Add socket wait for ToxiProxy client.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Changing ambiguity in service Id for TracingIT tests.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* More assertions to SDKResiliencyIT.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Add sidecar wait for TracingIT.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Wait for Zipkin endpoint.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Tacking flakiness on MethodInvokeIT and TracingIT.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Test again with 1.11.0 CLI.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Start bisect 1.12 regression.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Bisect step for runtime at 34c5102600b5a39704089b72db565ca95943269d

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* bisect step for runtime at ad5618711830510617e1b8fb2d0c6758f14ff6b9

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* bisect step for runtime at 4e5c51be62d8a7319ab25a401681ba82bd3ef7e7

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* git bisect step for runtime at 3143f2fcb679e585d978e9b9d706cce72088fecc

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* git bisect step for runtime at d243d1c6a17b019e0435ebbc10abb00810beb29a

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* git bisect step for runtime at 2ddb99be5ae61abd9f7f3616987fcfda0cedbc6e

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* git bisect step for runtime at 0fdab70eb32a63dd2630c39c4b1bc623212cd099

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* git bisect step for runtime at b42319279f21ee5c63d5cd04bfef6e94897cf34f

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Verify first bad commit at runtime: 0fdab70eb32a63dd2630c39c4b1bc623212cd099

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Trying artursouza/dapr at 37ca4c81041de11677ddea101298ca3c2ad8585d

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Add delay of 10s on MethodInvokeService for IT.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Trying dapr at artursouza's fork at 65e117433284388535f5a967456611a72773cf6b

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Change MethodInvokeService to use AppHealthCheck.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Change TracingIT to use AppHealthCheck.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Change to use artursouza's fork at f770694b3fbf7222c162a4ee4e13818a5afc3b01

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Remove use of artursouza's fork for runtime.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Fix MethodInvokeIT to actually use AppHealthCheck.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Try fix in runtime: artursouza/dapr at 72b6f7374a670c3054427aa2b01d2374e3bc3329

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Trying runtime as per artursouza at 64d19957059d134378603630165b3e473bdde388

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Increase delay to avoid race condition for app health checks.

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Try runtime at artursouza at d2eb15d1707ff8539ff1561a1fd67750d205854b

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

* Update to 1.12.0-rc.5

Signed-off-by: Artur Souza <asouza.pro@gmail.com>

---------

Signed-off-by: Artur Souza <asouza.pro@gmail.com>
Signed-off-by: Artur Souza <artursouza.ms@outlook.com>
2023-10-02 09:15:26 -07:00
.github Integration test stabilization + update proto and Dapr runtime to 1.12 RC. (#917) 2023-10-02 09:15:26 -07:00
daprdocs add distributed lock example (#930) 2023-09-25 10:25:24 -07:00
docs Generate updated javadocs for 1.9.0 (#878) 2023-06-12 09:57:46 -07:00
examples Migrate to Junit5 (#910) 2023-09-22 10:25:10 -07:00
scripts Initial Workflow SDK (#857) 2023-08-10 17:58:09 -07:00
sdk Migrate to Junit5 (#910) 2023-09-22 10:25:10 -07:00
sdk-actors Migrate to Junit5 (#910) 2023-09-22 10:25:10 -07:00
sdk-autogen Upgrade the version to 1.10.0-SNAPSHOT (#874) 2023-06-09 14:35:23 -07:00
sdk-springboot Migrate to Junit5 (#910) 2023-09-22 10:25:10 -07:00
sdk-tests Integration test stabilization + update proto and Dapr runtime to 1.12 RC. (#917) 2023-10-02 09:15:26 -07:00
sdk-workflows Migrate to Junit5 (#910) 2023-09-22 10:25:10 -07:00
.codecov.yaml Update state, secrets examples. Fix state toString. Ignore sdk-autogen in code coverage. (#340) 2020-09-21 15:06:46 -07:00
.gitignore feat(pubsub): add bulk subscribe support (#791) 2023-01-18 17:58:03 -08:00
.gitmodules Renames project to . Fixes examples. Adds proto files from release-0.3. 2019-12-05 18:30:13 -08:00
.java_header Config api support (#670) 2022-01-12 16:01:13 -08:00
.sdkmanrc Add .sdkmanrc config file and JDK installation instructions (#873) 2023-06-12 22:43:13 -07:00
CODEOWNERS Update CODEOWNERS (#571) 2021-07-02 18:38:35 -07:00
CONTRIBUTING.md Add DCO requirements and updated code of conduct (#669) 2021-12-30 00:04:20 -08:00
LICENSE Update LICENSE to Apache 2.0 (#657) 2021-12-09 20:15:47 +05:30
README.md Update instructions to spin dependent services (#920) 2023-09-22 10:35:14 -07:00
checkstyle.xml Config api support (#670) 2022-01-12 16:01:13 -08:00
pom.xml Integration test stabilization + update proto and Dapr runtime to 1.12 RC. (#917) 2023-10-02 09:15:26 -07:00
settings.xml Java SDK with all features implemented for milestone 0.4 (#154) 2020-01-24 12:49:56 -08:00
spotbugs-exclude.xml Exclude 'examples' modules from spotbugs analysis (#906) (#907) 2023-09-19 21:30:07 -07:00

README.md

Dapr SDK for Java

Build Status Discord codecov License: Apache-2.0 FOSSA Status Maven Central

This is the Dapr SDK for Java, including the following features:

  • PubSub
  • Service Invocation
  • Binding
  • State Store
  • Actors

Getting Started

Pre-Requisites

Install JDK

If using SDKMAN!, execute sdk env install to install the required JDK.

Importing Dapr's Java SDK

For a Maven project, add the following to your pom.xml file:

<project>
  ...
  <dependencies>
    ...
     <!-- Dapr's core SDK with all features, except Actors. -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk</artifactId>
      <version>1.9.0</version>
    </dependency>
    <!-- Dapr's SDK for Actors (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-actors</artifactId>
      <version>1.9.0</version>
    </dependency>
    <!-- Dapr's SDK integration with SpringBoot (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-springboot</artifactId>
      <version>1.9.0</version>
    </dependency>
    ...
  </dependencies>
  ...
</project>

For a Gradle project, add the following to your build.gradle file:

dependencies {
...
    // Dapr's core SDK with all features, except Actors.
    compile('io.dapr:dapr-sdk:1.9.0')
    // Dapr's SDK for Actors (optional).
    compile('io.dapr:dapr-sdk-actors:1.9.0')
    // Dapr's SDK integration with SpringBoot (optional).
    compile('io.dapr:dapr-sdk-springboot:1.9.0')
}

Running the examples

Clone this repository including the submodules:

git clone https://github.com/dapr/java-sdk.git

Then head over to build the Maven (Apache Maven version 3.x) project:

# make sure you are in the `java-sdk` directory.
mvn clean install

Try the following examples to learn more about Dapr's Java SDK:

API Documentation

Please, refer to our Javadoc website.

Reactor API

The Java SDK for Dapr is built using Project Reactor. It provides an asynchronous API for Java. When consuming a result is consumed synchronously, as in the examples referenced above, the block() method is used.

The code below does not make any API call, it simply returns the Mono publisher object. Nothing happens until the application subscribes or blocks on the result:

Mono<Void> result = daprClient.publishEvent("mytopic", "my message");

To start execution and receive the result object synchronously(void or Void becomes an empty result), use block(). The code below shows how to execute the call and consume an empty response:

Mono<Void> result = daprClient.publishEvent("mytopic", "my message");
result.block();

How to use a custom serializer

This SDK provides a basic serialization for request/response objects but also for state objects. Applications should provide their own serialization for production scenarios.

  1. Implement the DaprObjectSerializer interface. See this class as example.
  2. Use your serializer class in the following scenarios:
    DaprClient client = (new DaprClientBuilder())
        .withObjectSerializer(new MyObjectSerializer()) // for request/response objects.
        .withStateSerializer(new MyStateSerializer()) // for state objects.
        .build();
    
    • When registering an Actor Type:
    ActorRuntime.getInstance().registerActor(
      DemoActorImpl.class,
      new MyObjectSerializer(), // for request/response objects.
      new MyStateSerializer()); // for state objects.
    
    • When building a new instance of ActorProxy to invoke an Actor instance, use the same serializer as when registering the Actor Type:
    try (ActorClient actorClient = new ActorClient()) {
      DemoActor actor = (new ActorProxyBuilder(DemoActor.class, actorClient))
          .withObjectSerializer(new MyObjectSerializer()) // for request/response objects.
          .build(new ActorId("100"));
    }
    

Debug Java application or Dapr's Java SDK

In IntelliJ Community Edition, consider debugging in IntelliJ.

In Visual Studio Code, consider debugging in Visual Studio Code.

If you need to debug your Application, run Dapr sidecar separately and then start the application from your IDE (IntelliJ, for example). For Linux and MacOS:

dapr run --app-id testapp --app-port 3000 --dapr-http-port 3500 --dapr-grpc-port 5001

Note: confirm the correct port that the app will listen to and that the Dapr ports above are free, changing the ports if necessary.

When running your Java application from IDE, make sure the following environment variables are set, so the Java SDK knows how to connect to Dapr's sidecar:

DAPR_HTTP_PORT=3500
DAPR_GRPC_PORT=5001

Now you can go to your IDE (like Eclipse, for example) and debug your Java application, using port 3500 to call Dapr while also listening to port 3000 to expose Dapr's callback endpoint.

Exception handling

Most exceptions thrown from the SDK are instances of DaprException. DaprException extends from RuntimeException, making it compatible with Project Reactor. See example for more details.

Development

Update URL to fetch proto files

Change the dapr.proto.baseurl property below in pom.xml to point to the URL for the desired commit hash in Git if you need to target a proto file that is not been merged into master yet. Note: You may need to run mvn clean after changing this setting to remove any auto-generated files so that the new proto files get downloaded and compiled.

<project>
  ...
  <properties>
    ...
    <!-- change this .... -->
    <dapr.proto.baseurl>https://raw.githubusercontent.com/dapr/dapr/(current ref in pom.xml)/dapr/proto</dapr.proto.baseurl>
    <!-- to something like this: -->
    <dapr.proto.baseurl>https://raw.githubusercontent.com/dapr/dapr/1ac5d0e8590a7d6772c9957c236351ed992ccb19/dapr/proto</dapr.proto.baseurl>
    ...
  </properties>
  ...
</project>

Running Integration Tests

Pre-Requisites for ITs

Along with the pre-requisites for SDK the following are needed.

Code

The code for the tests are present inside the project sdk-tests. This module alone can be imported as a separate project in IDEs. This project depends on the rest of the JARs built by the other modules in the repo like sdk, sdk-springboot etc.

As a starting point for running Integration Tests, first run mvn clean install from the root of the repo to build the JARs for the different modules except the sdk-tests module.

Run all the dependent services spun up during build

During normal CI build, docker compose is used to bring up services like MongoDB, Hashicorp Vault, Apache Zookeeper, Kafka etc.

Similarly, all of these need to be run for running the ITs either individually or as a whole.

Run the following commands from the root of the repo to start all the docker containers that the tests depend on.

docker-compose -f ./sdk-tests/deploy/local-test.yml up -d

To stop the containers and services, run the following commands.

docker-compose -f ./sdk-tests/deploy/local-test.yml down

Run all ITs from command line

From the java-sdk repo root, change to the sdk-tests directory and run the following command.

## with current directory as /java-sdk/sdk-tests/

mvn clean install

The above command runs all the integration tests present in the sdk-tests project.

Run Individual tests from IntelliJ

In IntelliJ, go to File > New > Project from Existing Sources.... Import the sdk-tests project.

Once the project has been imported, the individual tests can be run normally as any Unit Tests, from the IDE itself.

intellij-integration-test.

Sometimes when the sdk-tests project does not build correctly, try File > Invalidate Caches... and try restarting IntelliJ.

You should be able to set breakpoints and Debug the test directly from IntelliJ itself as seen from the above image.