diff --git a/src/main/java/io/takima/temporalpractice/TemporalPracticeApplication.java b/src/main/java/io/takima/temporalpractice/TemporalPracticeApplication.java deleted file mode 100644 index ba8a0a529591d4b8a8c613479df23dd8c7e26585..0000000000000000000000000000000000000000 --- a/src/main/java/io/takima/temporalpractice/TemporalPracticeApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.takima.temporalpractice; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TemporalPracticeApplication { - - private static final Logger log = LoggerFactory.getLogger(TemporalPracticeApplication.class); - - public static void main(String[] args) { - log.info("Hello World!"); - } -} diff --git a/src/main/java/io/takima/temporalpractice/bakery/BakeService.java b/src/main/java/io/takima/temporalpractice/bakery/BakeService.java new file mode 100644 index 0000000000000000000000000000000000000000..398892c1860315de4762d8b5cd6b3821a274f28c --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/bakery/BakeService.java @@ -0,0 +1,4 @@ +package io.takima.temporalpractice.bakery; + +public class BakeService { +} diff --git a/src/main/java/io/takima/temporalpractice/bakery/BatterService.java b/src/main/java/io/takima/temporalpractice/bakery/BatterService.java new file mode 100644 index 0000000000000000000000000000000000000000..bc5a77fdba03e7dd646cfe4ed796e40e14a9463e --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/bakery/BatterService.java @@ -0,0 +1,4 @@ +package io.takima.temporalpractice.bakery; + +public class BatterService { +} diff --git a/src/main/java/io/takima/temporalpractice/bakery/BestCookieWorkflow.java b/src/main/java/io/takima/temporalpractice/bakery/BestCookieWorkflow.java new file mode 100644 index 0000000000000000000000000000000000000000..6b92a520db8611d2f777ac9536bebb6bb6140075 --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/bakery/BestCookieWorkflow.java @@ -0,0 +1,7 @@ +package io.takima.temporalpractice.bakery; + +public class BestCookieWorkflow { + public void orderCookie() { + System.out.println("Cookie ordered... Yuum"); + } +} \ No newline at end of file diff --git a/src/main/java/io/takima/temporalpractice/bakery/KitchenApp.java b/src/main/java/io/takima/temporalpractice/bakery/KitchenApp.java new file mode 100644 index 0000000000000000000000000000000000000000..b8248180508dba1de6e2713e6960b06ef9aea2a6 --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/bakery/KitchenApp.java @@ -0,0 +1,5 @@ +package io.takima.temporalpractice.bakery; + +public class KitchenApp { + public static void main(String[] args) {} +} diff --git a/src/main/java/io/takima/temporalpractice/signals/InventoryActivity.java b/src/main/java/io/takima/temporalpractice/signals/InventoryActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..b30a78aa3dd35799da8f1c9cb1f3f338f4ecc09b --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/signals/InventoryActivity.java @@ -0,0 +1,9 @@ +package io.takima.temporalpractice.signals; +import io.takima.temporalpractice.signals.InventoryWorkflow.ConsumeSignal; +import io.temporal.activity.ActivityInterface; + +@ActivityInterface +public interface InventoryActivity { + void reserve(ConsumeSignal input); + +} diff --git a/src/main/java/io/takima/temporalpractice/signals/InventoryActivityImpl.java b/src/main/java/io/takima/temporalpractice/signals/InventoryActivityImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..427e815a969e36aec3c3fa2d588eeb354061d53f --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/signals/InventoryActivityImpl.java @@ -0,0 +1,27 @@ +package io.takima.temporalpractice.signals; +import io.takima.temporalpractice.signals.InventoryWorkflow.ConsumeSignal; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InventoryActivityImpl implements InventoryActivity { + private static final Logger logger = LoggerFactory.getLogger(InventoryWorkflowImpl.class); + int counter; + + public InventoryActivityImpl(int inventorySize){ + this.counter = inventorySize; + } + + @Override + public void reserve(ConsumeSignal input) { + int currentValue = counter; + + try { + //Simulate async work + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + counter = currentValue - 1; + logger.info("counter: " + counter); + } +} diff --git a/src/main/java/io/takima/temporalpractice/signals/InventoryWorkflow.java b/src/main/java/io/takima/temporalpractice/signals/InventoryWorkflow.java new file mode 100644 index 0000000000000000000000000000000000000000..0a9894a0457332b1011c0c81ce1d2044cc95ea13 --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/signals/InventoryWorkflow.java @@ -0,0 +1,15 @@ +package io.takima.temporalpractice.signals; + +import io.temporal.workflow.SignalMethod; +import io.temporal.workflow.WorkflowInterface; +import io.temporal.workflow.WorkflowMethod; + +@WorkflowInterface +public interface InventoryWorkflow { + @WorkflowMethod + void run(); + @SignalMethod + void reserve(ConsumeSignal input); + record ConsumeSignal(int amount) { + } +} diff --git a/src/main/java/io/takima/temporalpractice/signals/MSMain.java b/src/main/java/io/takima/temporalpractice/signals/MSMain.java new file mode 100644 index 0000000000000000000000000000000000000000..8a1ea5d529091f2c0a5f83185bd308f5935b6779 --- /dev/null +++ b/src/main/java/io/takima/temporalpractice/signals/MSMain.java @@ -0,0 +1,40 @@ +package io.takima.temporalpractice.signals; + +import io.temporal.client.WorkflowClient; +import io.temporal.client.WorkflowOptions; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static io.takima.temporalpractice.temporal.TemporalUtils.*; + +public class MSMain { + + // Our inventory will contain 1000 elements and we will send 1000 signals, lets see how it goes + static int inventoryToDecrement = 1000; + + public static void main(String[] args) { + var worker = FACTORY.newWorker(MASTERING_SIGNALS_QUEUE); + worker.registerActivitiesImplementations(new InventoryActivityImpl(inventoryToDecrement)); + worker.registerWorkflowImplementationTypes(InventoryWorkflowImpl.class); + + FACTORY.start(); + + var workflow = CLIENT.newWorkflowStub( + InventoryWorkflow.class, + WorkflowOptions.newBuilder().setTaskQueue(MASTERING_SIGNALS_QUEUE).setWorkflowId("inventory").build() + ); + WorkflowClient.start(workflow::run); + + try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { + // Submit 1000 tasks + for (int i = 1; i < inventoryToDecrement; i++) { + executor.submit(() -> {; + workflow.reserve(new InventoryWorkflow.ConsumeSignal(1)); + + }); + } + } + + } +}