Dapr SDK for Java
Go to file
Maarten Mulders 70e18d8b5a
Prepare build for Java16 (#598)
* Upgrade Mockito to latest version

* Run GitHub Actions on Java 11 and 16

* Run JUnit tests with `--add-opens java.base/java.util=ALL-UNNAMED`

* Move Surefire JVM arguments to Maven property

* Update build.yml

* Update validate.yml

* simplily build singleton dapr http (#590)

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>

* Add Automerge workflow (#605)

* Add Automerge workflow

The automerge workflow will check for complete and approved pull requests and will merge them automatically.

Sources:
- For the python script to execute the merge: https://raw.githubusercontent.com/dapr/dapr/master/.github/scripts/automerge.py (only changed the label from "automerge" to "auto-merge")
- https://raw.githubusercontent.com/dapr/dapr/master/.github/workflows/dapr-bot-schedule.yml (only copied the automerge part, not the prune_stale part as that was not part of the issue.

Resolves https://github.com/dapr/java-sdk/issues/603

* Update automerge-bot.yml

* Update automerge-bot.yml

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>

* Cleanup Maven POM files (#604)

Added fixed versions for maven-deploy-plugin & spring-boot-maven-plugin as this would otherwise break in a future maven version.

Also fixed some indenting and removed duplicate declarations.

Co-authored-by: Dapr Bot <56698301+dapr-bot@users.noreply.github.com>

* Add support for @PostMapping("/path") to pub/sub topic subscriptions (#583)

* Remove duplicate dependency

* Transform into managed dependencies

* Remove old JUnit version from dependencies

* Add tests for DaprBeanPostProcessor

* Also register PostMappings that use value

* Modify existing pub/sub test to no use @PostMapping(path="...")

* Remove added dependencies on AssertJ, Spring Test and Servlet API

* Remove test in favour of the sdk-tests one

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>

* Run JUnit tests in all modules with java.base/java.util and java.base/java.lang opened to all modules

Co-authored-by: Artur Souza <artursouza.ms@outlook.com>
Co-authored-by: 浩 <inf2inf2@outlook.com>
Co-authored-by: Tom Cools <tom.cools@live.be>
Co-authored-by: Dapr Bot <56698301+dapr-bot@users.noreply.github.com>
2021-08-30 15:32:32 -07:00
.github Prepare build for Java16 (#598) 2021-08-30 15:32:32 -07:00
daprdocs Advise how to resolve OkHttp version conflict with Spring Boot (#589) 2021-08-24 15:12:17 -07:00
docs Generate updated javadocs for 1.2.0 (#586) 2021-07-29 09:17:05 -07:00
examples Cleanup Maven POM files (#604) 2021-08-20 19:07:31 -07:00
scripts Add dapr docs (#581) 2021-07-26 13:23:04 -07:00
sdk Prepare build for Java16 (#598) 2021-08-30 15:32:32 -07:00
sdk-actors Update GRPC libraries for security updates (#573) 2021-07-14 16:39:24 -07:00
sdk-autogen Update GRPC libraries for security updates (#573) 2021-07-14 16:39:24 -07:00
sdk-springboot Add support for @PostMapping("/path") to pub/sub topic subscriptions (#583) 2021-08-20 19:37:18 -07:00
sdk-tests Add support for @PostMapping("/path") to pub/sub topic subscriptions (#583) 2021-08-20 19:37:18 -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 Updating build pipeline for 0.9 rc. (#302) 2020-07-14 18:10:11 -07:00
.gitmodules Renames project to . Fixes examples. Adds proto files from release-0.3. 2019-12-05 18:30:13 -08:00
CODEOWNERS Update CODEOWNERS (#571) 2021-07-02 18:38:35 -07:00
CONTRIBUTING.md Update docs links 2020-10-23 11:46:41 -07:00
LICENSE Initial commit 2019-10-09 10:30:20 -07:00
README.md Generate updated javadocs for 1.2.0 (#586) 2021-07-29 09:17:05 -07:00
checkstyle.xml Update license header. (#483) 2021-02-06 00:18:47 -08:00
pom.xml Prepare build for Java16 (#598) 2021-08-30 15:32:32 -07:00
settings.xml Java SDK with all features implemented for milestone 0.4 (#154) 2020-01-24 12:49:56 -08:00

README.md

Dapr SDK for Java

Build Status Discord codecov License: MIT Maven Central

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

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

Getting Started

Pre-Requisites

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.2.0</version>
    </dependency>
    <!-- Dapr's SDK for Actors (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-actors</artifactId>
      <version>1.2.0</version>
    </dependency>
    <!-- Dapr's SDK integration with SpringBoot (optional). -->
    <dependency>
      <groupId>io.dapr</groupId>
      <artifactId>dapr-sdk-springboot</artifactId>
      <version>1.2.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.2.0')
    // Dapr's SDK for Actors (optional).
    compile('io.dapr:dapr-sdk-actors:1.2.0')
    // Dapr's SDK integration with SpringBoot (optional).
    compile('io.dapr:dapr-sdk-springboot:1.2.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 proto files

Change the properties below in pom.xml to point to the desired reference URL in Git. Avoid pointing to master branch since it can change over time and create unpredictable behavior in the build.

<project>
  ...
  <properties>
    ...
    <dapr.proto.url>https://raw.githubusercontent.com/dapr/dapr/v1.0.0/pkg/proto/dapr/dapr.proto</dapr.proto.url>
    <dapr.client.proto.url>https://raw.githubusercontent.com/dapr/dapr/v1.0.0/pkg/proto/daprclient/daprclient.proto</dapr.client.proto.url>
    ...
  </properties>
  ...
</project>