mirror of https://github.com/dapr/java-sdk.git
Springboot integration. (#256)
This commit is contained in:
parent
61e8a416d7
commit
4611f40cb5
|
@ -49,3 +49,6 @@ hs_err_pid*
|
||||||
/docs/dapr-sdk
|
/docs/dapr-sdk
|
||||||
/proto/dapr
|
/proto/dapr
|
||||||
/proto/daprclient
|
/proto/daprclient
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
|
@ -68,6 +68,12 @@ For a Maven project, add the following to your `pom.xml` file:
|
||||||
<artifactId>dapr-sdk-actors</artifactId>
|
<artifactId>dapr-sdk-actors</artifactId>
|
||||||
<version>0.3.0</version>
|
<version>0.3.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Dapr's SDK integration with SpringBoot (optional). -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk-springboot</artifactId>
|
||||||
|
<version>0.4.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
<!-- If needed, resolve version conflict of okhttp3. -->
|
<!-- If needed, resolve version conflict of okhttp3. -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
@ -103,6 +109,8 @@ dependencies {
|
||||||
compile('io.dapr:dapr-sdk:0.3.0')
|
compile('io.dapr:dapr-sdk:0.3.0')
|
||||||
// Dapr's SDK for Actors (optional).
|
// Dapr's SDK for Actors (optional).
|
||||||
compile('io.dapr:dapr-sdk-actors:0.3.0')
|
compile('io.dapr:dapr-sdk-actors:0.3.0')
|
||||||
|
// Dapr's SDK integration with SpringBoot (optional).
|
||||||
|
compile('io.dapr:dapr-sdk-springboot:0.4.0-SNAPSHOT')
|
||||||
|
|
||||||
// If needed, force conflict resolution for okhttp3.
|
// If needed, force conflict resolution for okhttp3.
|
||||||
configurations.all {
|
configurations.all {
|
||||||
|
|
|
@ -73,6 +73,11 @@
|
||||||
<artifactId>spring-boot-autoconfigure</artifactId>
|
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||||
<version>2.2.2.RELEASE</version>
|
<version>2.2.2.RELEASE</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk-springboot</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.dapr</groupId>
|
<groupId>io.dapr</groupId>
|
||||||
<artifactId>dapr-sdk-actors</artifactId>
|
<artifactId>dapr-sdk-actors</artifactId>
|
||||||
|
|
|
@ -12,6 +12,8 @@ import org.apache.commons.cli.CommandLineParser;
|
||||||
import org.apache.commons.cli.DefaultParser;
|
import org.apache.commons.cli.DefaultParser;
|
||||||
import org.apache.commons.cli.Options;
|
import org.apache.commons.cli.Options;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service for Actor runtime.
|
* Service for Actor runtime.
|
||||||
* 1. Build and install jars:
|
* 1. Build and install jars:
|
||||||
|
@ -36,7 +38,16 @@ public class DemoActorService {
|
||||||
CommandLine cmd = parser.parse(options, args);
|
CommandLine cmd = parser.parse(options, args);
|
||||||
|
|
||||||
// If port string is not valid, it will throw an exception.
|
// If port string is not valid, it will throw an exception.
|
||||||
int port = Integer.parseInt(cmd.getOptionValue("port"));
|
final int port = Integer.parseInt(cmd.getOptionValue("port"));
|
||||||
|
|
||||||
|
// Idle timeout until actor instance is deactivated.
|
||||||
|
ActorRuntime.getInstance().getConfig().setActorIdleTimeout(Duration.ofSeconds(30));
|
||||||
|
// How often actor instances are scanned for deactivation and balance.
|
||||||
|
ActorRuntime.getInstance().getConfig().setActorScanInterval(Duration.ofSeconds(10));
|
||||||
|
// How long to wait until for draining an ongoing API call for an actor instance.
|
||||||
|
ActorRuntime.getInstance().getConfig().setDrainOngoingCallTimeout(Duration.ofSeconds(10));
|
||||||
|
// Determines whether to drain API calls for actors instances being balanced.
|
||||||
|
ActorRuntime.getInstance().getConfig().setDrainBalancedActors(true);
|
||||||
|
|
||||||
// Register the Actor class.
|
// Register the Actor class.
|
||||||
ActorRuntime.getInstance().registerActor(DemoActorImpl.class);
|
ActorRuntime.getInstance().registerActor(DemoActorImpl.class);
|
||||||
|
|
|
@ -38,7 +38,6 @@ mvn install
|
||||||
The first Java class is `DemoActorService`. Its job is to register an implementation of `DemoActor` in the Dapr's Actor runtime. In `DemoActorService.java` file, you will find the `DemoActorService` class and the `main` method. See the code snippet below:
|
The first Java class is `DemoActorService`. Its job is to register an implementation of `DemoActor` in the Dapr's Actor runtime. In `DemoActorService.java` file, you will find the `DemoActorService` class and the `main` method. See the code snippet below:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@SpringBootApplication
|
|
||||||
public class DemoActorService {
|
public class DemoActorService {
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
|
@ -44,18 +44,14 @@ public class Subscriber {
|
||||||
```
|
```
|
||||||
`DaprApplication.start()` Method will run an Spring Boot application that registers the `SubscriberController`, which exposes the message retrieval as a POST request. The Dapr's sidecar is the one that performs the actual call to the controller, based on the pubsub features.
|
`DaprApplication.start()` Method will run an Spring Boot application that registers the `SubscriberController`, which exposes the message retrieval as a POST request. The Dapr's sidecar is the one that performs the actual call to the controller, based on the pubsub features.
|
||||||
|
|
||||||
This Spring Controller handles the message endpoint, Printing the recieved message which is recieved as the POST body. See the code snippet below:
|
This Spring Controller handles the message endpoint, Printing the message which is received as the POST body. The topic subscription in Dapr is handled automatically via the `@Topic` annotation. See the code snippet below:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@RestController
|
@RestController
|
||||||
public class SubscriberController {
|
public class SubscriberController {
|
||||||
///...
|
///...
|
||||||
@GetMapping("/dapr/subscribe")
|
@Topic(name = "testingtopic")
|
||||||
public byte[] daprConfig() throws Exception {
|
@PostMapping(path = "/testingtopic")
|
||||||
return SERIALIZER.serialize(new String[] { "message" });
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping(path = "/message")
|
|
||||||
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
||||||
@RequestHeader Map<String, String> headers) {
|
@RequestHeader Map<String, String> headers) {
|
||||||
return Mono.fromRunnable(() -> {
|
return Mono.fromRunnable(() -> {
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
package io.dapr.examples.pubsub.http;
|
package io.dapr.examples.pubsub.http;
|
||||||
|
|
||||||
|
import io.dapr.Topic;
|
||||||
import io.dapr.client.domain.CloudEvent;
|
import io.dapr.client.domain.CloudEvent;
|
||||||
import io.dapr.serializer.DefaultObjectSerializer;
|
import io.dapr.serializer.DefaultObjectSerializer;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
@ -22,22 +23,13 @@ import java.util.Map;
|
||||||
@RestController
|
@RestController
|
||||||
public class SubscriberController {
|
public class SubscriberController {
|
||||||
|
|
||||||
/**
|
|
||||||
* Dapr's default serializer/deserializer.
|
|
||||||
*/
|
|
||||||
private static final DefaultObjectSerializer SERIALIZER = new DefaultObjectSerializer();
|
|
||||||
|
|
||||||
@GetMapping("/dapr/subscribe")
|
|
||||||
public byte[] daprConfig() throws Exception {
|
|
||||||
return SERIALIZER.serialize(new String[]{"testingtopic"});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles a registered publish endpoint on this app.
|
* Handles a registered publish endpoint on this app.
|
||||||
* @param body The body of the http message.
|
* @param body The body of the http message.
|
||||||
* @param headers The headers of the http message.
|
* @param headers The headers of the http message.
|
||||||
* @return A message containing the time.
|
* @return A message containing the time.
|
||||||
*/
|
*/
|
||||||
|
@Topic(name = "testingtopic")
|
||||||
@PostMapping(path = "/testingtopic")
|
@PostMapping(path = "/testingtopic")
|
||||||
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
||||||
@RequestHeader Map<String, String> headers) {
|
@RequestHeader Map<String, String> headers) {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dapr's HTTP callback implementation via SpringBoot.
|
* Dapr's HTTP callback implementation via SpringBoot.
|
||||||
|
* Scanning package io.dapr.springboot is required.
|
||||||
*/
|
*/
|
||||||
@SpringBootApplication(scanBasePackages = {"io.dapr.springboot", "io.dapr.examples"})
|
@SpringBootApplication(scanBasePackages = {"io.dapr.springboot", "io.dapr.examples"})
|
||||||
public class DaprApplication {
|
public class DaprApplication {
|
||||||
|
|
1
pom.xml
1
pom.xml
|
@ -252,6 +252,7 @@
|
||||||
<module>sdk-autogen</module>
|
<module>sdk-autogen</module>
|
||||||
<module>sdk</module>
|
<module>sdk</module>
|
||||||
<module>sdk-actors</module>
|
<module>sdk-actors</module>
|
||||||
|
<module>sdk-springboot</module>
|
||||||
<module>examples</module>
|
<module>examples</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
<project
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk-parent</artifactId>
|
||||||
|
<version>0.4.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>dapr-sdk-springboot</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<version>0.4.0-SNAPSHOT</version>
|
||||||
|
<name>dapr-sdk-springboot</name>
|
||||||
|
<description>SDK extension for Springboot</description>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
<id>central</id>
|
||||||
|
<name>libs-release</name>
|
||||||
|
<url>https://repo.spring.io/libs-release</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.deploy.skip>false</maven.deploy.skip>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk-actors</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.gmazzo</groupId>
|
||||||
|
<artifactId>okhttp-mock</artifactId>
|
||||||
|
<version>1.3.2</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>5.5.2</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-beans</artifactId>
|
||||||
|
<version>5.2.3.RELEASE</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
<version>5.2.2.RELEASE</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
<version>5.2.2.RELEASE</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<version>5.2.2.RELEASE</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.1.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
<version>0.8.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>default-prepare-agent</id>
|
||||||
|
<goals>
|
||||||
|
<goal>prepare-agent</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>report</id>
|
||||||
|
<phase>test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>report</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>target/jacoco-report/</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>check</id>
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<rules>
|
||||||
|
<rule>
|
||||||
|
<element>BUNDLE</element>
|
||||||
|
<limits>
|
||||||
|
<limit>
|
||||||
|
<counter>LINE</counter>
|
||||||
|
<value>COVEREDRATIO</value>
|
||||||
|
<minimum>80%</minimum>
|
||||||
|
</limit>
|
||||||
|
</limits>
|
||||||
|
</rule>
|
||||||
|
</rules>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
* Licensed under the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.dapr.springboot;
|
||||||
|
|
||||||
|
import io.dapr.Topic;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class DaprBeanPostProcessor implements BeanPostProcessor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
if (bean == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribeToTopics(bean.getClass());
|
||||||
|
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void subscribeToTopics(Class clazz) {
|
||||||
|
if (clazz == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribeToTopics(clazz.getSuperclass());
|
||||||
|
for (Method method : clazz.getDeclaredMethods()) {
|
||||||
|
Topic topic = method.getAnnotation(Topic.class);
|
||||||
|
if (topic == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String topicName = topic.name();
|
||||||
|
if ((topicName != null) && (topicName.length() > 0)) {
|
||||||
|
DaprRuntime.getInstance().addSubscribedTopic(topicName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
package io.dapr.springboot;
|
package io.dapr.springboot;
|
||||||
|
|
||||||
import io.dapr.actors.runtime.ActorRuntime;
|
import io.dapr.actors.runtime.ActorRuntime;
|
||||||
|
import io.dapr.serializer.DefaultObjectSerializer;
|
||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
@ -21,16 +22,21 @@ import reactor.core.publisher.Mono;
|
||||||
@RestController
|
@RestController
|
||||||
public class DaprController {
|
public class DaprController {
|
||||||
|
|
||||||
@GetMapping("/")
|
/**
|
||||||
public String index() {
|
* Dapr's default serializer/deserializer.
|
||||||
return "Greetings from Dapr!";
|
*/
|
||||||
}
|
private static final DefaultObjectSerializer SERIALIZER = new DefaultObjectSerializer();
|
||||||
|
|
||||||
@GetMapping("/dapr/config")
|
@GetMapping("/dapr/config")
|
||||||
public byte[] daprConfig() throws Exception {
|
public byte[] daprConfig() throws Exception {
|
||||||
return ActorRuntime.getInstance().serializeConfig();
|
return ActorRuntime.getInstance().serializeConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/dapr/subscribe")
|
||||||
|
public byte[] daprSubscribe() throws Exception {
|
||||||
|
return SERIALIZER.serialize(DaprRuntime.getInstance().listSubscribedTopics());
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping(path = "/actors/{type}/{id}")
|
@PostMapping(path = "/actors/{type}/{id}")
|
||||||
public Mono<Void> activateActor(@PathVariable("type") String type,
|
public Mono<Void> activateActor(@PathVariable("type") String type,
|
||||||
@PathVariable("id") String id) throws Exception {
|
@PathVariable("id") String id) throws Exception {
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
* Licensed under the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.dapr.springboot;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
class DaprRuntime {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance.
|
||||||
|
*/
|
||||||
|
private static volatile DaprRuntime instance;
|
||||||
|
|
||||||
|
private final Set<String> subscribedTopics = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor to make this singleton.
|
||||||
|
*/
|
||||||
|
private DaprRuntime() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an DaprRuntime object.
|
||||||
|
*
|
||||||
|
* @return An DaprRuntime object.
|
||||||
|
*/
|
||||||
|
public static DaprRuntime getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
synchronized (DaprRuntime.class) {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new DaprRuntime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void addSubscribedTopic(String topicName) {
|
||||||
|
if (!this.subscribedTopics.contains(topicName)) {
|
||||||
|
this.subscribedTopics.add(topicName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized String[] listSubscribedTopics() {
|
||||||
|
return this.subscribedTopics.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,6 +41,12 @@
|
||||||
<version>${dapr.sdk.version}</version>
|
<version>${dapr.sdk.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dapr</groupId>
|
||||||
|
<artifactId>dapr-sdk-springboot</artifactId>
|
||||||
|
<version>${dapr.sdk.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
|
|
|
@ -11,7 +11,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
/**
|
/**
|
||||||
* Dapr's HTTP callback implementation via SpringBoot.
|
* Dapr's HTTP callback implementation via SpringBoot.
|
||||||
*/
|
*/
|
||||||
@SpringBootApplication(scanBasePackages = {"io.dapr.it.actors.app"})
|
@SpringBootApplication(scanBasePackages = {"io.dapr.springboot", "io.dapr.it.actors.app"})
|
||||||
public class TestApplication {
|
public class TestApplication {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Microsoft Corporation.
|
|
||||||
* Licensed under the MIT License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.dapr.it.actors.app;
|
|
||||||
|
|
||||||
import io.dapr.actors.runtime.ActorRuntime;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import reactor.core.publisher.Mono;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SpringBoot Controller to handle callback APIs for Dapr.
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
class TestController {
|
|
||||||
|
|
||||||
@GetMapping("/")
|
|
||||||
public String index() {
|
|
||||||
return "Greetings from Dapr!";
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/dapr/config")
|
|
||||||
public byte[] daprConfig() throws Exception {
|
|
||||||
return ActorRuntime.getInstance().serializeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping(path = "/actors/{type}/{id}")
|
|
||||||
public Mono<Void> activateActor(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id) throws Exception {
|
|
||||||
return ActorRuntime.getInstance().activate(type, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping(path = "/actors/{type}/{id}")
|
|
||||||
public Mono<Void> deactivateActor(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id) throws Exception {
|
|
||||||
return ActorRuntime.getInstance().deactivate(type, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/{method}")
|
|
||||||
public Mono<byte[]> invokeActorMethod(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("method") String method,
|
|
||||||
@RequestBody(required = false) byte[] body) {
|
|
||||||
return ActorRuntime.getInstance().invoke(type, id, method, body);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/timer/{timer}")
|
|
||||||
public Mono<Void> invokeActorTimer(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("timer") String timer) {
|
|
||||||
return ActorRuntime.getInstance().invokeTimer(type, id, timer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/remind/{reminder}")
|
|
||||||
public Mono<Void> invokeActorReminder(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("reminder") String reminder,
|
|
||||||
@RequestBody(required = false) byte[] body) {
|
|
||||||
return ActorRuntime.getInstance().invokeReminder(type, id, reminder, body);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -11,7 +11,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
/**
|
/**
|
||||||
* Dapr's HTTP callback implementation via SpringBoot.
|
* Dapr's HTTP callback implementation via SpringBoot.
|
||||||
*/
|
*/
|
||||||
@SpringBootApplication(scanBasePackages = {"io.dapr.it.actors.services.springboot"})
|
@SpringBootApplication(scanBasePackages = {"io.dapr.springboot", "io.dapr.it.actors.services.springboot"})
|
||||||
public class DaprApplication {
|
public class DaprApplication {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Microsoft Corporation.
|
|
||||||
* Licensed under the MIT License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.dapr.it.actors.services.springboot;
|
|
||||||
|
|
||||||
import io.dapr.actors.runtime.ActorRuntime;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import reactor.core.publisher.Mono;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SpringBoot Controller to handle callback APIs for Dapr.
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
public class DaprController {
|
|
||||||
|
|
||||||
@GetMapping("/")
|
|
||||||
public String index() {
|
|
||||||
return "Greetings from Dapr!";
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/dapr/config")
|
|
||||||
public byte[] daprConfig() throws Exception {
|
|
||||||
return ActorRuntime.getInstance().serializeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping(path = "/actors/{type}/{id}")
|
|
||||||
public Mono<Void> activateActor(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id) throws Exception {
|
|
||||||
return ActorRuntime.getInstance().activate(type, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping(path = "/actors/{type}/{id}")
|
|
||||||
public Mono<Void> deactivateActor(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id) throws Exception {
|
|
||||||
return ActorRuntime.getInstance().deactivate(type, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/{method}")
|
|
||||||
public Mono<byte[]> invokeActorMethod(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("method") String method,
|
|
||||||
@RequestBody(required = false) byte[] body) {
|
|
||||||
return ActorRuntime.getInstance().invoke(type, id, method, body);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/timer/{timer}")
|
|
||||||
public Mono<Void> invokeActorTimer(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("timer") String timer) {
|
|
||||||
return ActorRuntime.getInstance().invokeTimer(type, id, timer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping(path = "/actors/{type}/{id}/method/remind/{reminder}")
|
|
||||||
public Mono<Void> invokeActorReminder(@PathVariable("type") String type,
|
|
||||||
@PathVariable("id") String id,
|
|
||||||
@PathVariable("reminder") String reminder,
|
|
||||||
@RequestBody(required = false) byte[] body) {
|
|
||||||
return ActorRuntime.getInstance().invokeReminder(type, id, reminder, body);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -22,11 +22,6 @@ public class InputBindingController {
|
||||||
|
|
||||||
private static final List<String> messagesReceived = new ArrayList();
|
private static final List<String> messagesReceived = new ArrayList();
|
||||||
|
|
||||||
@GetMapping("/dapr/config")
|
|
||||||
public String daprConfig() throws Exception {
|
|
||||||
return "{}";
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping(path = "/sample123")
|
@PostMapping(path = "/sample123")
|
||||||
@PutMapping(path = "/sample123")
|
@PutMapping(path = "/sample123")
|
||||||
public void handleInputBinding(@RequestBody(required = false) String body) {
|
public void handleInputBinding(@RequestBody(required = false) String body) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
/**
|
/**
|
||||||
* Service for subscriber.
|
* Service for subscriber.
|
||||||
*/
|
*/
|
||||||
@SpringBootApplication(scanBasePackages = {"io.dapr.it.methodinvoke.http"})
|
@SpringBootApplication
|
||||||
public class MethodInvokeService {
|
public class MethodInvokeService {
|
||||||
|
|
||||||
public static final String SUCCESS_MESSAGE = "dapr initialized. Status: Running. Init Elapsed";
|
public static final String SUCCESS_MESSAGE = "dapr initialized. Status: Running. Init Elapsed";
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
package io.dapr.it.pubsub.http;
|
package io.dapr.it.pubsub.http;
|
||||||
|
|
||||||
|
import io.dapr.Topic;
|
||||||
import io.dapr.client.domain.CloudEvent;
|
import io.dapr.client.domain.CloudEvent;
|
||||||
import io.dapr.serializer.DefaultObjectSerializer;
|
import io.dapr.serializer.DefaultObjectSerializer;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
@ -22,21 +23,12 @@ public class SubscriberController {
|
||||||
|
|
||||||
private static final List<String> messagesReceived = new ArrayList();
|
private static final List<String> messagesReceived = new ArrayList();
|
||||||
|
|
||||||
/**
|
|
||||||
* Dapr's default serializer/deserializer.
|
|
||||||
*/
|
|
||||||
private static final DefaultObjectSerializer SERIALIZER = new DefaultObjectSerializer ();
|
|
||||||
|
|
||||||
@GetMapping("/dapr/subscribe")
|
|
||||||
public byte[] daprConfig() throws Exception {
|
|
||||||
return SERIALIZER.serialize(new String[] { "testingtopic" });
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping(path = "/messages")
|
@GetMapping(path = "/messages")
|
||||||
public List<String> getMessages() {
|
public List<String> getMessages() {
|
||||||
return messagesReceived;
|
return messagesReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Topic(name = "testingtopic")
|
||||||
@PostMapping(path = "/testingtopic")
|
@PostMapping(path = "/testingtopic")
|
||||||
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
public Mono<Void> handleMessage(@RequestBody(required = false) byte[] body,
|
||||||
@RequestHeader Map<String, String> headers) {
|
@RequestHeader Map<String, String> headers) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
/**
|
/**
|
||||||
* Service for subscriber.
|
* Service for subscriber.
|
||||||
*/
|
*/
|
||||||
@SpringBootApplication(scanBasePackages = {"io.dapr.it.pubsub.http"})
|
@SpringBootApplication(scanBasePackages = {"io.dapr.springboot", "io.dapr.it.pubsub.http"})
|
||||||
public class SubscriberService {
|
public class SubscriberService {
|
||||||
|
|
||||||
public static final String SUCCESS_MESSAGE = "dapr initialized. Status: Running. Init Elapsed";
|
public static final String SUCCESS_MESSAGE = "dapr initialized. Status: Running. Init Elapsed";
|
||||||
|
|
|
@ -7,7 +7,6 @@ package io.dapr.it.secrets;
|
||||||
|
|
||||||
import com.bettercloud.vault.Vault;
|
import com.bettercloud.vault.Vault;
|
||||||
import com.bettercloud.vault.VaultConfig;
|
import com.bettercloud.vault.VaultConfig;
|
||||||
import com.bettercloud.vault.response.LogicalResponse;
|
|
||||||
import io.dapr.client.DaprClient;
|
import io.dapr.client.DaprClient;
|
||||||
import io.dapr.client.DaprClientBuilder;
|
import io.dapr.client.DaprClientBuilder;
|
||||||
import io.dapr.client.DaprClientGrpc;
|
import io.dapr.client.DaprClientGrpc;
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
* Licensed under the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.dapr;
|
||||||
|
|
||||||
|
import java.lang.annotation.Documented;
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Documented
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Topic {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of topic to be subscribed to.
|
||||||
|
*
|
||||||
|
* @return Topic's name.
|
||||||
|
*/
|
||||||
|
String name();
|
||||||
|
}
|
Loading…
Reference in New Issue