-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Implement an interface for functions that need to handle failures. I took a more OOP approach for this feature which is slightly different than the other SDKs but we can discuss this further in the PR review. The `WithFailureHandler` interface has a single method `onFailure` that is called when the function fails. An example of how to use this: ```kotlin class MyFunction : InngestFunction(), WithFailureHandler { override fun execute(ctx: FunctionContext, step: Step): Any? { // Do something } override fun onFailure(ctx: FunctionContext, step: Step): Any? { // Handle failure } } ``` * Add a function with an onFailure handler and a test for it * Add a Kotlin function example that has a failure handler * Make name in InngestFunctionConfigBuilder internal * Run formatting * Switch to an overridable `onFailure` method in `InngestFunction` This removes the `WithFailureHandler` interface and instead provides an overridable `onFailure` method in `InngestFunction` that can be used to define a function to be called when the function fails. It's used in the same way but without the need to implement an interface ```kotlin class MyFunction : InngestFunction() { override fun execute(ctx: FunctionContext, step: Step): Any? { // Do something } override fun onFailure(ctx: FunctionContext, step: Step): Any? { // Handle failure } } ``` * Address PR comments related to code clarity
- Loading branch information
Showing
10 changed files
with
230 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 39 additions & 0 deletions
39
inngest-spring-boot-demo/src/main/java/com/inngest/springbootdemo/EventsResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package com.inngest.springbootdemo; | ||
|
||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
@Getter | ||
@Setter | ||
@JsonIgnoreProperties(ignoreUnknown = true) | ||
class EventsResponse { | ||
EventEntry[] data; | ||
} | ||
|
||
@Getter | ||
@Setter | ||
@JsonIgnoreProperties(ignoreUnknown = true) | ||
class EventEntry { | ||
String id; | ||
String name; | ||
|
||
String internal_id; | ||
|
||
EventEntryData data; | ||
} | ||
|
||
@Getter | ||
@Setter | ||
@JsonIgnoreProperties(ignoreUnknown = true) | ||
class EventEntryData{ | ||
EventData event; | ||
} | ||
|
||
@Getter | ||
@Setter | ||
@JsonIgnoreProperties(ignoreUnknown = true) | ||
class EventData { | ||
String name; | ||
} | ||
|
31 changes: 31 additions & 0 deletions
31
...ot-demo/src/main/java/com/inngest/springbootdemo/testfunctions/WithOnFailureFunction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.inngest.springbootdemo.testfunctions; | ||
|
||
import com.inngest.*; | ||
import org.jetbrains.annotations.NotNull; | ||
import org.jetbrains.annotations.Nullable; | ||
|
||
public class WithOnFailureFunction extends InngestFunction { | ||
@NotNull | ||
@Override | ||
public InngestFunctionConfigBuilder config(InngestFunctionConfigBuilder builder) { | ||
return builder | ||
.id("with-on-failure-function") | ||
.name("With On Failure Function") | ||
.triggerEvent("test/with-on-failure"); | ||
} | ||
|
||
@Override | ||
public String execute(FunctionContext ctx, Step step) { | ||
step.run("fail-step", () -> { | ||
throw new NonRetriableError("something fatally went wrong"); | ||
}, String.class); | ||
|
||
return "Success"; | ||
} | ||
|
||
@Nullable | ||
@Override | ||
public String onFailure(@NotNull FunctionContext ctx, @NotNull Step step) { | ||
return "On Failure Success"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
57 changes: 57 additions & 0 deletions
57
...ring-boot-demo/src/test/java/com/inngest/springbootdemo/WithOnFailureIntegrationTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package com.inngest.springbootdemo; | ||
|
||
import com.inngest.CommHandler; | ||
import com.inngest.Inngest; | ||
import org.junit.jupiter.api.BeforeAll; | ||
import org.junit.jupiter.api.Test; | ||
import org.junit.jupiter.api.parallel.Execution; | ||
import org.junit.jupiter.api.parallel.ExecutionMode; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Arrays; | ||
import java.util.LinkedHashMap; | ||
import java.util.Optional; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertNotNull; | ||
|
||
@IntegrationTest | ||
@Execution(ExecutionMode.CONCURRENT) | ||
class WithOnFailureIntegrationTest { | ||
@Autowired | ||
private DevServerComponent devServer; | ||
|
||
static int sleepTime = 5000; | ||
|
||
@Autowired | ||
private Inngest client; | ||
|
||
@Test | ||
void testWithOnFailureShouldCallOnFailure() throws Exception { | ||
String eventName = "test/with-on-failure"; | ||
String eventId = InngestFunctionTestHelpers.sendEvent(client, eventName).getIds()[0]; | ||
|
||
Thread.sleep(sleepTime); | ||
|
||
// Check that the original function failed | ||
RunEntry<Object> run = devServer.runsByEvent(eventId).first(); | ||
LinkedHashMap<String, String> output = (LinkedHashMap<String, String>) run.getOutput(); | ||
|
||
assertEquals("Failed", run.getStatus()); | ||
assertNotNull(run.getEnded_at()); | ||
assert output.get("name").contains("NonRetriableError"); | ||
|
||
// Check that the onFailure function was called | ||
Optional<EventEntry> event = Arrays.stream(devServer.listEvents().getData()) | ||
.filter(e -> "inngest/function.failed".equals(e.getName()) && eventName.equals(e.getData().getEvent().getName())) | ||
.findFirst(); | ||
|
||
assert event.isPresent(); | ||
|
||
RunEntry<Object> onFailureRun = devServer.runsByEvent(event.get().getInternal_id()).first(); | ||
|
||
assertEquals("Completed", onFailureRun.getStatus()); | ||
assertEquals("On Failure Success", (String) onFailureRun.getOutput()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 34 additions & 0 deletions
34
inngest-test-server/src/main/kotlin/com/inngest/testserver/SlackFailureReport.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package com.inngest.testserver | ||
|
||
import com.inngest.* | ||
|
||
class SlackFailureReport : InngestFunction() { | ||
override fun config(builder: InngestFunctionConfigBuilder): InngestFunctionConfigBuilder = | ||
builder | ||
.id("always-fail-fn") | ||
.name("Always Fail Function") | ||
.triggerEvent("always-fail-fn") | ||
|
||
override fun execute( | ||
ctx: FunctionContext, | ||
step: Step, | ||
): String { | ||
step.run("throw exception") { | ||
throw RuntimeException("This function always fails") | ||
"Step result" | ||
} | ||
|
||
return "Success" | ||
} | ||
|
||
override fun onFailure( | ||
ctx: FunctionContext, | ||
step: Step, | ||
): String { | ||
step.run("send slack message") { | ||
"Sending a message to Slack" | ||
} | ||
|
||
return "onFailure Success" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters