From 0293b76fd9836bfd90f1371f1c671eb2800e48ae Mon Sep 17 00:00:00 2001
From: Damien MARCHAT <dmarchat@takima.fr>
Date: Mon, 3 Mar 2025 17:17:51 +0100
Subject: [PATCH] wip : setting up the base project

---
 .../TemporalPracticeApplication.java          | 13 ------
 .../temporalpractice/bakery/BakeService.java  |  4 ++
 .../bakery/BatterService.java                 |  4 ++
 .../bakery/BestCookieWorkflow.java            |  7 ++++
 .../temporalpractice/bakery/KitchenApp.java   |  5 +++
 .../signals/InventoryActivity.java            |  9 +++++
 .../signals/InventoryActivityImpl.java        | 27 +++++++++++++
 .../signals/InventoryWorkflow.java            | 15 +++++++
 .../temporalpractice/signals/MSMain.java      | 40 +++++++++++++++++++
 9 files changed, 111 insertions(+), 13 deletions(-)
 delete mode 100644 src/main/java/io/takima/temporalpractice/TemporalPracticeApplication.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/BakeService.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/BatterService.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/BestCookieWorkflow.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/KitchenApp.java
 create mode 100644 src/main/java/io/takima/temporalpractice/signals/InventoryActivity.java
 create mode 100644 src/main/java/io/takima/temporalpractice/signals/InventoryActivityImpl.java
 create mode 100644 src/main/java/io/takima/temporalpractice/signals/InventoryWorkflow.java
 create mode 100644 src/main/java/io/takima/temporalpractice/signals/MSMain.java

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 ba8a0a5..0000000
--- 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 0000000..398892c
--- /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 0000000..bc5a77f
--- /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 0000000..6b92a52
--- /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 0000000..b824818
--- /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 0000000..b30a78a
--- /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 0000000..427e815
--- /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 0000000..0a9894a
--- /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 0000000..8a1ea5d
--- /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));
+
+                });
+            }
+        }
+
+    }
+}
-- 
GitLab