Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/dependency-submission.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,9 @@ jobs:
with:
distribution: 'temurin'
java-version: 17
- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@v4
5 changes: 5 additions & 0 deletions .github/workflows/docker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

- name: Log into GitHub container registry
uses: docker/login-action@v2
with:
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ jobs:
if: ${{ inputs.serviceImage == '' }}
uses: gradle/actions/setup-gradle@v4

- name: Install Rust toolchain
if: ${{ inputs.serviceImage == '' }}
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

- name: Build restatedev/test-services-java image
if: ${{ inputs.serviceImage == '' }}
run: ./gradlew -Djib.console=plain :test-services:jibDockerBuild
Expand All @@ -135,7 +141,7 @@ jobs:

- name: Run test tool
continue-on-error: ${{ inputs.continueOnError == 'true' }}
uses: restatedev/e2e/sdk-tests@v1.0
uses: restatedev/e2e/sdk-tests@v2.1
with:
envVars: ${{ inputs.envVars }}
testArtifactOutput: ${{ inputs.testArtifactOutput != '' && inputs.testArtifactOutput || 'sdk-java-integration-test-report' }}
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/release-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ jobs:
java-version: '21'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

- name: Build Javadocs
run: gradle :sdk-aggregated-javadocs:javadoc
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

# Retrieve the version of the SDK
- name: Install dasel
run: curl -sSLf "$(curl -sSLf https://api.github.com/repos/tomwright/dasel/releases/latest | grep browser_download_url | grep linux_amd64 | grep -v .gz | cut -d\" -f 4)" -L -o dasel && chmod +x dasel && mv ./dasel /usr/local/bin/dasel
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

- name: Pull Restate docker image
run: docker pull ghcr.io/restatedev/restate:main

Expand Down Expand Up @@ -54,6 +59,10 @@ jobs:
java-version: '21'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown

- name: Build Javadocs
run: gradle :sdk-aggregated-javadocs:javadoc
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ build
kls_database.db
.kotlin

.restate
.restate
/sdk-core/src/main/rust/target/
85 changes: 85 additions & 0 deletions examples/src/main/java/my/restate/sdk/examples/ConcurrentRuns.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
//
// This file is part of the Restate Java SDK,
// which is released under the MIT license.
//
// You can find a copy of the license in file LICENSE in the root
// directory of this repository or package, or at
// https://github.com/restatedev/sdk-java/blob/main/LICENSE
package my.restate.sdk.examples;

import dev.restate.sdk.DurableFuture;
import dev.restate.sdk.Restate;
import dev.restate.sdk.annotation.Handler;
import dev.restate.sdk.annotation.Service;
import dev.restate.sdk.endpoint.Endpoint;
import dev.restate.sdk.http.vertx.RestateHttpServer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
* Spawns N concurrent {@code ctx.run} steps, each producing a large random payload (100KB–2MB),
* with ~1-in-4 retryable failures sprinkled in. Returns the concatenation of all the payloads.
*
* <p>Useful to exercise cooperative suspension and AwaitingOnMessage with a non-trivial {@code
* AllSucceededOrFirstFailed} combinator that the runtime can observe while runs are in flight.
*/
@Service
public class ConcurrentRuns {

private static final Logger LOG = LogManager.getLogger(ConcurrentRuns.class);

private static final int NUM_RUNS = 6;
private static final int MIN_PAYLOAD_BYTES = 100 * 1024;
private static final int MAX_PAYLOAD_BYTES = 2 * 1024 * 1024;
private static final int FAILURE_DENOMINATOR = 4;

private static final String ALPHABET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

@Handler
public String run() {
List<DurableFuture<String>> futures = new ArrayList<>(NUM_RUNS);
for (int i = 0; i < NUM_RUNS; i++) {
final int idx = i;
futures.add(
Restate.runAsync(
"payload-" + idx,
String.class,
() -> {
if (ThreadLocalRandom.current().nextInt(FAILURE_DENOMINATOR) == 0) {
LOG.info("Run {} simulating retryable failure", idx);
throw new RuntimeException("simulated retryable failure on run " + idx);
}
int size =
ThreadLocalRandom.current().nextInt(MIN_PAYLOAD_BYTES, MAX_PAYLOAD_BYTES + 1);
LOG.info("Run {} generating {} bytes", idx, size);
return randomString(size);
}));
}

DurableFuture.all((List) futures).await();

StringBuilder sb = new StringBuilder();
for (DurableFuture<String> f : futures) {
sb.append(f.await());
}
return sb.toString();
}

private static String randomString(int size) {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
char[] buf = new char[size];
for (int i = 0; i < size; i++) {
buf[i] = ALPHABET.charAt(rnd.nextInt(ALPHABET.length()));
}
return new String(buf);
}

public static void main(String[] args) {
RestateHttpServer.listen(Endpoint.bind(new ConcurrentRuns()).build());
}
}
46 changes: 44 additions & 2 deletions examples/src/main/java/my/restate/sdk/examples/Greeter.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,67 @@
// https://github.com/restatedev/sdk-java/blob/main/LICENSE
package my.restate.sdk.examples;

import dev.restate.sdk.Restate;
import dev.restate.sdk.annotation.Handler;
import dev.restate.sdk.annotation.Service;
import dev.restate.sdk.endpoint.Endpoint;
import dev.restate.sdk.http.vertx.RestateHttpServer;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.http.Http2Settings;
import io.vertx.core.http.HttpServerOptions;
import java.time.Duration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Service
public class Greeter {

private static final Logger LOG = LogManager.getLogger(Greeter.class);

public record Greeting(String name) {}

public record GreetingResponse(String message) {}

@Handler
public GreetingResponse greet(Greeting req) {
Restate.sleep(Duration.ofSeconds(1));

// Respond to caller
return new GreetingResponse("You said hi to " + req.name + "!");
return new GreetingResponse(
"You said hi to "
+ req.name
+ " for the "
+ Restate.virtualObject(Counter.class, req.name).getAndAdd(1).newValue()
+ "th time!");
}

public static void main(String[] args) {
RestateHttpServer.listen(Endpoint.bind(new Greeter()));
var vertxOptions = new VertxOptions();
var eventLoopPoolSize = vertxOptions.getEventLoopPoolSize();
var vertx = Vertx.vertx(new VertxOptions());
var httpServerOptions =
new HttpServerOptions().setInitialSettings(new Http2Settings().setMaxConcurrentStreams(10));

var endpoint = Endpoint.bind(new Greeter()).bind(new Counter()).build();

for (int i = 0; i < eventLoopPoolSize; i++) {
vertx.deployVerticle(
new AbstractVerticle() {
@Override
public void start(Promise<Void> startPromise) {
RestateHttpServer.fromEndpoint(vertx, endpoint, httpServerOptions)
.listen(9080)
.map(
server -> {
LOG.info("Server started on port {}", server.actualPort());
return (Void) null;
})
.andThen(startPromise);
}
});
}
}
}
13 changes: 12 additions & 1 deletion examples/src/main/resources/log4j2.properties
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,23 @@ appender.console.filter.replay.0.type = KeyValuePair
appender.console.filter.replay.0.key = restateInvocationStatus
appender.console.filter.replay.0.value = REPLAYING

logger.example.name = my.restate
logger.example.level = warn
logger.example.additivity = false
logger.example.appenderRef.console.ref = consoleLogger

# Restate logs to info level
logger.app.name = dev.restate
logger.app.level = info
logger.app.level = warn
logger.app.additivity = false
logger.app.appenderRef.console.ref = consoleLogger

# Restate vm logs to trace level
logger.core.name = dev.restate.sdk.core.sharedcore
logger.core.level = warn
logger.core.additivity = false
logger.core.appenderRef.console.ref = consoleLogger

# Root logger
rootLogger.level = warn
rootLogger.appenderRef.stdout.ref = consoleLogger
40 changes: 26 additions & 14 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -147,18 +147,6 @@
[libraries.micrometer-context-propagation.version]
ref = 'micrometer-context-propagation'

[libraries.protobuf-java]
module = 'com.google.protobuf:protobuf-java'

[libraries.protobuf-java.version]
ref = 'protobuf'

[libraries.protobuf-kotlin]
module = 'com.google.protobuf:protobuf-kotlin'

[libraries.protobuf-kotlin.version]
ref = 'protobuf'

[libraries.schema-kenerator-core]
module = 'io.github.smiley4:schema-kenerator-core'

Expand Down Expand Up @@ -243,15 +231,39 @@
[libraries.victools-jsonschema-module-jackson.version]
ref = 'victools-json-schema'

[libraries.chicory-runtime]
module = 'com.dylibso.chicory:runtime'

[libraries.chicory-runtime.version]
ref = 'chicory'

[libraries.chicory-annotations]
module = 'com.dylibso.chicory:annotations'

[libraries.chicory-annotations.version]
ref = 'chicory'

[libraries.chicory-annotations-processor]
module = 'com.dylibso.chicory:annotations-processor'

[libraries.chicory-annotations-processor.version]
ref = 'chicory'

[libraries.jackson-cbor]
module = 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor'

[libraries.jackson-cbor.version]
ref = 'jackson'

[plugins]
wasm2class = 'at.released.wasm2class.plugin:0.5.0'
aggregate-javadoc = 'io.freefair.aggregate-javadoc:8.14'
dependency-license-report = 'com.github.jk1.dependency-license-report:2.9'
dokka = 'org.jetbrains.dokka:1.9.20'
jib = 'com.google.cloud.tools.jib:3.4.5'
jsonschema2pojo = 'org.jsonschema2pojo:1.2.2'
nexus-publish = 'io.github.gradle-nexus.publish-plugin:1.3.0'
openapi-generator = 'org.openapi.generator:7.17.0'
protobuf = 'com.google.protobuf:0.9.4'
shadow = 'com.gradleup.shadow:9.0.0-beta8'
spotless = 'com.diffplug.spotless:7.2.1'
spring-dependency-management = 'io.spring.dependency-management:1.1.6'
Expand All @@ -263,6 +275,7 @@
ref = 'ksp'

[versions]
chicory = '1.7.5'
jackson = '2.19.4'
junit = '5.14.1'
kotlinx-coroutines = '1.10.2'
Expand All @@ -272,7 +285,6 @@
micrometer = '1.14.14'
micrometer-context-propagation = '1.1.3'
opentelemetry = '1.58.0'
protobuf = '4.29.3'
restate = '2.9.0-SNAPSHOT'
schema-kenerator = '2.1.2'
spring-boot = '3.4.13'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ internal constructor(
)
.await()

object : BaseInvocationHandle<Res>(handlerContext, responseSerde) {
object : BaseInvocationHandle<Res>(this, responseSerde) {
override suspend fun invocationId(): String = invocationIdAsyncResult.poll().await()
}
}
Expand All @@ -136,7 +136,7 @@ internal constructor(
responseTypeTag: TypeTag<Res>,
): InvocationHandle<Res> =
resolveSerde<Res>(responseTypeTag).let { responseSerde ->
object : BaseInvocationHandle<Res>(handlerContext, responseSerde) {
object : BaseInvocationHandle<Res>(this, responseSerde) {
override suspend fun invocationId(): String = invocationId
}
}
Expand Down Expand Up @@ -200,6 +200,14 @@ internal constructor(
return AwakeableHandleImpl(this, id)
}

override suspend fun <T : Any> signal(name: String, typeTag: TypeTag<T>): DurableFuture<T> {
checkNotInsideRun()
val serde: Serde<T> = resolveSerde(typeTag)
return SingleDurableFutureImpl(handlerContext.signal(name).await()).simpleMap {
serde.deserialize(it)
}
}

override fun random(): RestateRandom {
return this.random
}
Expand Down
Loading
Loading