Skip to content

Commit

Permalink
Merge branch 'main' into cleanup_tags
Browse files Browse the repository at this point in the history
  • Loading branch information
gvdongen authored Jun 21, 2024
2 parents 80fea4e + 1fe5999 commit 0f63e83
Show file tree
Hide file tree
Showing 59 changed files with 995 additions and 757 deletions.
22 changes: 22 additions & 0 deletions code_snippets/java/src/main/java/concepts/services/Greeter.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,50 @@
*/

// <start_here>
// <mark_1>
@VirtualObject
public class Greeter {
// </mark_1>

public final static StateKey<Integer> COUNT =
StateKey.of("count", JsonSerdes.INT);

// <mark_1>
// <mark_3>
@Handler
public String greet(ObjectContext ctx, String greeting) {
// </mark_3>
// </mark_1>
// <mark_2>
Integer count = ctx.get(COUNT).orElse(0);
count++;
ctx.set(COUNT, count);
// </mark_2>
// <mark_1>
return greeting + " " + ctx.key() + "for the " + count + "-th time";
// </mark_1>
}

// <mark_1>
// <mark_3>
@Handler
public String ungreet(ObjectContext ctx) {
// </mark_3>
// </mark_1>
// <mark_2>
Integer count = ctx.get(COUNT).orElse(0);
// </mark_2>
if (count > 0) {
// <mark_2>
count--;
// </mark_2>
}
// <mark_2>
ctx.set(COUNT, count);
// </mark_2>
// <mark_1>
return "Dear " + ctx.key() + ", taking one greeting back";
// </mark_1>
}

public static void main(String[] args) {
Expand Down
23 changes: 21 additions & 2 deletions code_snippets/java/src/main/java/concepts/services/Payment.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,19 @@
import dev.restate.sdk.common.DurablePromiseKey;
import dev.restate.sdk.common.StateKey;
import dev.restate.sdk.common.TerminalException;
import dev.restate.sdk.http.vertx.RestateHttpEndpointBuilder;
import dev.restate.sdk.serde.jackson.JacksonSerdes;


// <start_workflow>
// <start_here>
@Workflow
public class Payment {

private final StateKey<String> STATUS = StateKey.of("status", JsonSerdes.STRING);
private static final DurablePromiseKey<PaymentSuccess> PAYMENT_SUCCESS =
DurablePromiseKey.of("payment.success", JacksonSerdes.of(PaymentSuccess.class));

// <mark_1>
@Workflow
public String run(WorkflowContext ctx, PaymentRequest payment) {

Expand All @@ -33,26 +35,43 @@ public String run(WorkflowContext ctx, PaymentRequest payment) {
ctx.run("make a payment", JsonSerdes.BOOLEAN, () ->
PaymentClient.charge(ctx.key(), payment.getAccount(), payment.getAmount()));

// <mark_3>
ctx.promise(PAYMENT_SUCCESS).awaitable().await();
// </mark_3>

// <mark_2>
ctx.set(STATUS, "Payment succeeded");
// </mark_2>

ctx.run("notify the user", JsonSerdes.BOOLEAN, () ->
EmailClient.sendSuccessNotification(payment.getEmail()));

// <mark_2>
ctx.set(STATUS, "User notified of payment success");
// </mark_2>

return "success";
}
// </mark_1>

// <mark_3>
@Shared
public void paymentWebhook(SharedWorkflowContext ctx, PaymentSuccess msg) {
ctx.promiseHandle(PAYMENT_SUCCESS).resolve(msg);
}
// </mark_3>

// <mark_2>
@Shared
public String getStatus(SharedWorkflowContext ctx) {
return ctx.get(STATUS).orElse("unknown");
}
// </mark_2>

public static void main(String[] args) {
RestateHttpEndpointBuilder.builder()
.bind(new Payment())
.buildAndListen();
}
}
// <end_workflow>
// <end_here>
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,32 @@
*/

// <start_here>
// <mark_2>
@Service
public class RoleUpdateService {
// </mark_2>

// <mark_2>
@Handler
public void applyRoleUpdate(Context ctx, UpdateRequest req) {
// </mark_2>
// <mark_1>
boolean success = ctx.run(JsonSerdes.BOOLEAN, () ->
SystemA.applyUserRole(req.getUserId(), req.getRole()));
// </mark_1>
// <mark_3>
if (!success) {
return;
}
// </mark_3>

// <mark_3>
for(String permission: req.getPermissions()) {
ctx.run(JsonSerdes.BOOLEAN, () ->
// </mark_3>
// <mark_1>
ctx.run(JsonSerdes.BOOLEAN, () ->
SystemB.applyPermission(req.getUserId(), permission));
// </mark_1>
}
}

Expand Down
46 changes: 26 additions & 20 deletions code_snippets/java/src/main/java/develop/Awakeables.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,32 @@

public class Awakeables {

public void awakeables(ObjectContext ctx) {
// <start_create>
Awakeable<String> awakeable = ctx.awakeable(JsonSerdes.STRING);
String awakeableId = awakeable.id();

ctx.run(() -> triggerTaskAndDeliverId(awakeableId));

String payload = awakeable.await();
// <end_create>

// <start_resolve>
ctx.awakeableHandle(awakeableId)
.resolve(JsonSerdes.STRING, "hello");
// <end_resolve>

// <start_reject>
ctx.awakeableHandle(awakeableId)
.reject("my error reason");
// <end_reject>
}
public void awakeables(ObjectContext ctx) {
// <start_here>
// <mark_1>
Awakeable<String> awakeable = ctx.awakeable(JsonSerdes.STRING);
String awakeableId = awakeable.id();
// </mark_1>

// <mark_2>
ctx.run(() -> triggerTaskAndDeliverId(awakeableId));
// </mark_2>

// <mark_3>
String payload = awakeable.await();
// </mark_3>
// <end_here>

// <start_resolve>
ctx.awakeableHandle(awakeableId)
.resolve(JsonSerdes.STRING, "hello");
// <end_resolve>

// <start_reject>
ctx.awakeableHandle(awakeableId)
.reject("my error reason");
// <end_reject>
}

public void triggerTaskAndDeliverId(String awakeableId) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import java.util.UUID;

class SideEffects {
class JournalingResults {

void sideEffect(Context ctx) {

Expand Down
1 change: 0 additions & 1 deletion code_snippets/java/src/main/java/develop/MyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// <start_here>
@Service
public class MyService {

@Handler
public String myHandler(Context ctx, String input) {
return "my-output";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ private void delayedCall(Context ctx) {
private void orderingGuarantees(Context ctx){
String objectKey = "";
// <start_ordering>
MyVirtualObjectClient.fromContext(ctx, objectKey).send().myHandler("Hi!");
MyVirtualObjectClient.fromContext(ctx, objectKey).send().myHandler("Hi again!");
MyVirtualObjectClient.fromContext(ctx, objectKey).send().myHandler("I'm call A");
MyVirtualObjectClient.fromContext(ctx, objectKey).send().myHandler("I'm call B");
// <end_ordering>
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public class SignupWorkflow {
private static final StateKey<String> STATUS =
StateKey.of("status", JsonSerdes.STRING);

// <mark_1>
@Workflow
public boolean run(WorkflowContext ctx, Email email) {
String secret = ctx.random().nextUUID().toString();
Expand All @@ -28,28 +29,37 @@ public boolean run(WorkflowContext ctx, Email email) {
() -> sendEmailWithLink(email, secret));
ctx.set(STATUS, "Sent email");

// <mark_3>
String clickSecret = ctx.promise(EMAIL_CLICKED)
.awaitable()
.await();
// </mark_3>
ctx.set(STATUS, "Clicked email");

return clickSecret.equals(secret);
}
// </mark_1>

@Shared
public void click(SharedWorkflowContext ctx, String secret) {
// <mark_3>
ctx.promiseHandle(EMAIL_CLICKED).resolve(secret);
// </mark_3>
}

// <mark_2>
@Shared
public String getStatus(SharedWorkflowContext ctx) {
return ctx.get(STATUS).orElse("Unknown");
}
// </mark_2>

public static void main(String[] args) {
// <mark_4>
RestateHttpEndpointBuilder.builder()
.bind(new SignupWorkflow())
.buildAndListen();
// </mark_4>
}
}
// <end_here>
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,6 @@ public void rejectEmail(SharedWorkflowContext ctx){
ctx.promiseHandle(EMAIL_LINK).reject("Abort verification");
}
// </mark_6>

public static void main(String[] args) {
RestateHttpEndpointBuilder
.builder()
.bind(new SignupWorkflow())
.buildAndListen();
}
}
// <end_here>

10 changes: 8 additions & 2 deletions code_snippets/kotlin/src/main/kotlin/develop/Awakeables.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,20 @@ import dev.restate.sdk.kotlin.*

class Awakeables {
suspend fun awakeables(ctx: ObjectContext) {
// <start_create>
// <start_here>
// <mark_1>
val awakeable = ctx.awakeable<String>()
val awakeableId: String = awakeable.id
// </mark_1>

// <mark_2>
ctx.runBlock{ triggerTaskAndDeliverId(awakeableId) }
// </mark_2>

// <mark_3>
val payload: String = awakeable.await()
// <end_create>
// </mark_3>
// <end_here>


// <start_resolve>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package develop
import dev.restate.sdk.common.TerminalException
import dev.restate.sdk.kotlin.*
import java.util.*
import kotlin.time.Duration.Companion.seconds

internal class SideEffects {
suspend fun sideEffect(ctx: Context) {
Expand Down
1 change: 0 additions & 1 deletion code_snippets/kotlin/src/main/kotlin/develop/MyService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import dev.restate.sdk.kotlin.Context
// <start_here>
@Service
class MyService {

@Handler
suspend fun myHandler(ctx: Context, input: String): String {
return "my-output"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class SignupWorkflow {
private val STATUS = KtStateKey.json<String>("status")
}

// <mark_1>
@Workflow
suspend fun run(ctx: WorkflowContext, email: Email): Boolean {
val secret = ctx.random().nextUUID().toString()
Expand All @@ -24,30 +25,40 @@ class SignupWorkflow {
sendEmailWithLink(email, secret)
}

// <mark_3>
val clickSecret = ctx.promise(EMAIL_CLICKED)
.awaitable()
.await()
// </mark_3>
ctx.set(STATUS, "Clicked email")

return clickSecret == secret
}
// </mark_1>

@Shared
suspend fun click(ctx: SharedWorkflowContext, secret: String) {
// <mark_3>
ctx.promiseHandle(EMAIL_CLICKED).resolve(secret)
// </mark_3>
}

// <mark_2>
@Shared
suspend fun getStatus(ctx: SharedWorkflowContext): String? {
return ctx.get(STATUS)
}
// </mark_2>
}


fun main() {
// <mark_4>
RestateHttpEndpointBuilder
.builder()
.bind(SignupWorkflow())
.buildAndListen()
// </mark_4>
}
// <end_here>

Expand Down
Loading

0 comments on commit 0f63e83

Please sign in to comment.