Dapr SDK for Java
Go to file
Will 57b86c5d2e
Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649)
* Generate updated javadocs for 1.3.1 (#643)

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Migrated out of JCenter as a Maven repository manager (#648)

* Upgrade okhttp-mock dependency

Version 1.3.2 was never deployed to Maven Central

* No longer refer to JCenter, as it has been shut down

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* initial commit: modified ./dapr/client/DaprClientHttpTest.java unit test

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* refactored hardcoded 127.0.0.1 localhost IP to use Dapr sidecar IP

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* refactored hardcoded 127.0.0.1 localhost IP to use Dapr sidecar IP

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* cleaned up unused imports

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* fixed tabbing and imports

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* added utils for getting local host and test utils for ipv6 addresses

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Add auto-assign dapr_bot workflow (#654)

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Bump actions/setup-java from 2.3.1 to 2.4.0 (#663)

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.3.1 to 2.4.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2.3.1...v2.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* added HTTP client tests for IPv6 addresses

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* fixed tests by returning SIDECAR_IP to IPv4 address

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* changes to address PMD code validation violations

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* changing back to loopback address for DEFAULT_SIDECAR_IP fallback

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Fix vault example + Upgrade Dapr CLI and runtime. (#666)

* Upgrade Dapr CLI and runtime.

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

* Fix expected vault output.

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Update LICENSE to Apache 2.0 (#657)

* Update LICENSE to Apache 2.0

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

* Update headers to Apache 2.

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Bump actions/github-script from 1 to 5 (#655)

Bumps [actions/github-script](https://github.com/actions/github-script) from 1 to 5.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v1...v5)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Add DCO requirements and updated code of conduct (#669)

Issue reference: dapr/docs#2039

Signed-off-by: Will <william.wl.tsai@gmail.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Bump actions/setup-java from 2.4.0 to 2.5.0 (#668)

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.4.0 to 2.5.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2.4.0...v2.5.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Config api support (#670)

* inital draft for config api

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* Introducing new client for preview apis and code refactoring

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* Unit tests and code refactoring

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* Adding integration test

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Copyright changes

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Review comments fixes

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Removed DaprPreviewClientProxy and updated example README

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Adding validate workflow for cofiguration api example

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* fixing example autovalidation and code coverage

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Fixing autovalidation and removing getAllConfiguration

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Fixing review comments

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* Add regex header checkstyle.

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

* Fix headers and add javadocs to some.

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Update for next release: 1.5.0 snapshot (#672)

* Update CLI and runtime to 1.6.0-rc.x

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>

* Upgrade the version to 1.5.0-SNAPSHOT

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Update proto RC. (#674)

Signed-off-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Java SDK - Documentation for configuration API methods (#676)

* Java SDK - Documentation for configuration API methods

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

* review comment fixes

Signed-off-by: pravinpushkar <ppushkar@microsoft.com>

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* Generate updated javadocs for 1.4.0 (#677)

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* address package dependency issue on integration test

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* added comment to include spec for ipv6 represention in url

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* corrected comment in NetworkUtils.getHostLoopbackAddress()

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* added comment to include spec for ipv6 represention in url

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* updated dependency scope to test

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>

* fix NetworkUtils.java

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* checkstyle fix in NetworkUtils.java

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* fix imports

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* fix ipv6 formatting issues

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* fix ipv6 formatting issues

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* fix code style nits

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

* refactor formatIpAddress method in actors utls

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

---------

Signed-off-by: Will Tsai <william.wl.tsai@gmail.com>
Signed-off-by: Artur Souza <artursouza.ms@outlook.com>
Signed-off-by: Will <william.wl.tsai@gmail.com>
Signed-off-by: Will <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Co-authored-by: Maarten Mulders <mthmulders@users.noreply.github.com>
Co-authored-by: Mukundan Sundararajan <musundar@microsoft.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com>
Co-authored-by: Pravin Pushkar <ppushkar@microsoft.com>
Co-authored-by: Cassie Coyle <cassie@diagrid.io>
2024-02-20 07:55:27 -08:00
.github Improve build name in GH actions to avoid change on patch upgrades. (#1014) 2024-02-19 11:07:22 -08:00
.mvn/wrapper Add maven wrapper (#925) 2023-10-08 22:35:19 -07:00
daprdocs Add the dapr runtime returned error details to the Java DaprException (#998) 2024-02-13 13:34:50 -08:00
docs Generate updated javadocs for 1.10.0 (#937) 2023-10-11 16:55:35 -07:00
examples Add bulk subscriber over gRPC to examples (#871) 2024-02-16 15:54:57 -08:00
scripts Next release 1.11.0 snapshot (#934) 2023-10-03 14:12:28 -07:00
sdk Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649) 2024-02-20 07:55:27 -08:00
sdk-actors Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649) 2024-02-20 07:55:27 -08:00
sdk-autogen Upgrade the version to 1.12.0-SNAPSHOT (#1011) 2024-02-15 14:03:52 -08:00
sdk-springboot Upgrade springboot to 2.7.18 (#987) 2024-02-15 14:05:11 -08:00
sdk-springboot3 Upgrade the version to 1.12.0-SNAPSHOT (#1011) 2024-02-15 14:03:52 -08:00
sdk-tests Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649) 2024-02-20 07:55:27 -08:00
sdk-workflows Show registered workflows and Activities (#953) 2024-02-16 15:53:33 -08: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 Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649) 2024-02-20 07:55:27 -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 maven wrapper (#925) 2023-10-08 22:35:19 -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 add health check to wait for sidecar and test it (#918) 2023-12-18 20:31:42 -08:00
checkstyle.xml Config api support (#670) 2022-01-12 16:01:13 -08:00
mvnw Add maven wrapper (#925) 2023-10-08 22:35:19 -07:00
mvnw.cmd Add maven wrapper (#925) 2023-10-08 22:35:19 -07:00
pom.xml Upgrade the version to 1.12.0-SNAPSHOT (#1011) 2024-02-15 14:03:52 -08: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 Add JDK17 and springboot 3.0 support (#975) 2024-01-15 08:30:35 -08: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.10.0</version>
    </dependency>
    <!-- Dapr's SDK for Actors (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-actors</artifactId>
      <version>1.10.0</version>
    </dependency>
    <!-- Dapr's SDK integration with SpringBoot (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-springboot</artifactId>
      <version>1.10.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.10.0')
    // Dapr's SDK for Actors (optional).
    compile('io.dapr:dapr-sdk-actors:1.10.0')
    // Dapr's SDK integration with SpringBoot (optional).
    compile('io.dapr:dapr-sdk-springboot:1.10.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.
./mvnw 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. A result is consumed synchronously by using the block() method, as shown in the examples referenced above.

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, and state objects. Applications should provide their own serialization for production scenarios.

  1. Implement the DaprObjectSerializer interface. See this class as an 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 a 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 the Dapr sidecar separately, and then start the application from your IDE (IntelliJ or Eclipse, 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 your 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 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 the exception 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 ./mvnw 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 (ITs)

Pre-Requisites

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 the Integration Tests, first run ./mvnw 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/

../mvnw 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.