{"id":16809473,"url":"https://github.com/mostafacs/quarkus-temporal-extension","last_synced_at":"2025-04-11T01:21:04.663Z","repository":{"id":46112799,"uuid":"359283745","full_name":"mostafacs/quarkus-temporal-extension","owner":"mostafacs","description":"Temporal workflow engine integration with quarkus","archived":false,"fork":false,"pushed_at":"2023-03-27T21:19:25.000Z","size":129,"stargazers_count":16,"open_issues_count":2,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-24T22:19:52.721Z","etag":null,"topics":["java","quarkus","temporal","temporal-extension","temporal-workflow","temporal-workflows","temporalio"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mostafacs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-19T00:33:54.000Z","updated_at":"2024-07-01T08:10:22.000Z","dependencies_parsed_at":"2025-02-18T11:31:57.058Z","dependency_job_id":"5ce25b3b-e8fe-49c5-ab77-7f0c4dfec4e2","html_url":"https://github.com/mostafacs/quarkus-temporal-extension","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mostafacs%2Fquarkus-temporal-extension","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mostafacs%2Fquarkus-temporal-extension/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mostafacs%2Fquarkus-temporal-extension/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mostafacs%2Fquarkus-temporal-extension/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mostafacs","download_url":"https://codeload.github.com/mostafacs/quarkus-temporal-extension/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248323230,"owners_count":21084466,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","quarkus","temporal","temporal-extension","temporal-workflow","temporal-workflows","temporalio"],"created_at":"2024-10-13T10:12:52.541Z","updated_at":"2025-04-11T01:21:04.647Z","avatar_url":"https://github.com/mostafacs.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QUARKUS - TEMPORAL EXTENSION\n\nWith this extension you can easily implement a temporal workflow in your quarkus project.\nReview this [demo](https://github.com/mostafacs/quarkus-temporal-demo) for a quick start.\n## How to use ?\n\n1- Add extension dependency to your maven POM file.\n\n* Quarkus 2.4.2 , JDK 11 and Native Image Build Support (graalvm-ce-java11-21.2.0)\n\n ```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.sellware.quarkus-temporal\u003c/groupId\u003e\n    \u003cartifactId\u003etemporal-client\u003c/artifactId\u003e\n    \u003cversion\u003e2.0.4\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* Quarkus 1.x , JDK 8 ( Native image build not supported)\n\n ```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.sellware.quarkus-temporal\u003c/groupId\u003e\n    \u003cartifactId\u003etemporal-client\u003c/artifactId\u003e\n    \u003cversion\u003e1.13.1.7\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n2- Updated netty-shaded on quarkus-bom\n\n```xml\n \u003cdependencyManagement\u003e\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eio.quarkus\u003c/groupId\u003e\n            \u003cartifactId\u003equarkus-bom\u003c/artifactId\u003e\n            \u003cversion\u003e${quarkus.platform.version}\u003c/version\u003e\n            \u003ctype\u003epom\u003c/type\u003e\n            \u003cscope\u003eimport\u003c/scope\u003e\n        \u003c/dependency\u003e\n        \u003c!-- Only necessary while quarkus does not bump the netty-all lib. --\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eio.grpc\u003c/groupId\u003e\n            \u003cartifactId\u003egrpc-netty-shaded\u003c/artifactId\u003e\n            \u003cversion\u003e1.39.0\u003c/version\u003e\n        \u003c/dependency\u003e\n    \u003c/dependencies\u003e\n\u003c/dependencyManagement\u003e\n```\n\n3- Add temporal server url config in `application.properties`\n\n```properties\nquarkus.temporal.service.url=localhost:7233\nquarkus.temporal.multi-tenant.enabled=false # false is the default\n```\n\nEnable multi-tenancy will init RequestContext before calling the activity method.\n\n4- Add configuration file named `workflow.yml` to resources folder\n\n* Field `name` in annotation `@TemporalWorkflow` used to load workflow configurations\n* Field `name` in annotation `@TemporalActivity` used to load activities configurations\n\n#### Example\n\n```yml\ndefaults:\n  workflowExecutionTimeout: 20 # in minutes default is 60 minute if not set\n  workflowRunTimeout: 15 # in minutes default is 60 minute\n  workflowTaskTimeout: 14 # in minutes default is 60 minute\n\n  activityScheduleToStartTimeout: 60 # in minutes default is 60 minute\n  activityScheduleToCloseTimeout: 60 # in minutes default is 60 minute\n  activityStartToCloseTimeout: 60 # in minutes default is 60 minute\n  #heartbeat timeout must be shorter than START_TO_CLOSE timeout\n  activityHeartBeatTimeout: 5 # in minutes default is 60 minute\n  activityRetryInitInterval: 1 # in minutes default is 5 minute\n  activityRetryMaxInterval: 1 # in minutes default is 1 minute if not set\n  activityRetryBackOffCoefficient: 1.0  # default is 1.0\n  activityRetryMaxAttempts: 5  # default is 1 attempt\n\n# override defaults per workflow\nworkflows:\n  test:\n    executionTimeout: 2\n    runTimeout: 2\n    taskTimeout: 2\n    activities:\n      test:\n        scheduleTostartTimeout: 10\n        scheduleTocloseTimeout: 10\n        #startTocloseTimeout: 20\n        #heartbeatTimeout: 2\n        #retryInitInterval: 1\n        #retryMaxInterval: 1\n        #retryMaxAttempts: 1\n```\n\n### Declare your Temporal Activities:\n\n```java\n    @ActivityInterface\n    public interface TestActivity {\n    \n        String hello();\n    }\n```\n\n```java\n    // name used to get the activity configurations from workflow.yml\n    @TemporalActivity(name=\"test\")\n    public class TestActivityImpl implements TestActivity {\n    \n        // you can inject your services here.\n \n        @Override\n        public String hello() {\n            return \"I'm hello activity\";\n        }\n    }\n```\n\n### Declare your Temporal Workflows:\n\n```java\n    @WorkflowInterface\n    public interface TestWorkflow {\n    \n        @WorkflowMethod\n        void run();\n    }\n```\n\n```java\n    @TemporalWorkflow(queue = \"testQueue\", name=\"test\")\n    public class TestWorkflowImpl implements TestWorkflow {\n    \n        @TemporalActivityStub\n        TestActivity testActivity;\n    \n        @Override\n        public void run() {\n            System.out.println(testActivity.hello());\n            Workflow.sleep(10000);\n            System.out.println(\"Workflow \u003c\u003c1\u003e\u003e completed\");\n        }\n    }\n```\n\n### Add your own interceptors (you can add many interceptors classes)\n```java \n    @Singleton\n    @Unremovable\n    public class TemporalLoggingInterceptor implements WorkerInterceptor {\n        \n        @Override\n        public WorkflowInboundCallsInterceptor interceptWorkflow(WorkflowInboundCallsInterceptor next) {\n            return new MyWorkflowInboundInterceptor(next);\n        }\n    \n        @Override\n        public ActivityInboundCallsInterceptor interceptActivity(ActivityInboundCallsInterceptor next) {\n            return new MyActivityInboundInterceptor(next);\n        }\n        \n    }  \n```\n\n### Run your workflow:\n\n```java\n\n    @Path(\"/temporal-client\")\n    @ApplicationScoped\n    public class TemporalClientController {\n    \n        @Inject\n        WorkflowBuilder workflowBuilder;\n    \n        @GET\n        public String hello() {\n            TestWorkflow testWorkflow = workflowBuilder.build(TestWorkflow.class, \"test123\");\n            WorkflowClient.execute(testWorkflow::run);\n            return \"workfow started\";\n        }\n    }\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmostafacs%2Fquarkus-temporal-extension","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmostafacs%2Fquarkus-temporal-extension","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmostafacs%2Fquarkus-temporal-extension/lists"}