Skip to content
This repository was archived by the owner on Sep 18, 2023. It is now read-only.

Can't invoke activity from WorkflowMethod  #35

@tush4hworks

Description

@tush4hworks
import logging
import time

from cadence.activity_method import activity_method
from cadence.workerfactory import WorkerFactory
from cadence.workflow import workflow_method, Workflow, WorkflowClient, signal_method, query_method

logging.basicConfig(level=logging.DEBUG)

TASK_LIST = "SubsActivity-python-tasklistd3sasa4552asddasdsa1sda31"
DOMAIN = "sample2"
QUOTA = 5


class SubscriptionActivity:
    @activity_method(task_list=TASK_LIST)
    def cancel(self):
        return "Cancel"


class SubscriptionActivityImpl(SubscriptionActivity):

    def cancel(self):
        return "Cancel"


class SubscriptionWfInterface:
    @workflow_method(task_list=TASK_LIST)
    async def manage_subscription(self, name):
        raise NotImplementedError

    @signal_method()
    async def decrement(self):
        raise NotImplementedError

    @signal_method()
    async def renew_subscription(self):
        raise NotImplementedError

    @query_method()
    async def get_quota(self):
        raise NotImplementedError


class SubscriptionWf(SubscriptionWfInterface):
    def __init__(self):
        self.subscription_activities: SubscriptionActivity = Workflow.new_activity_stub(SubscriptionActivity)
        self.quota = QUOTA

    async def manage_subscription(self, name):
        self.name = name
        print(f"Started workflow for {self.name}")
        print(Workflow.get_workflow_id())

        await Workflow.await_till(lambda: self.quota <= 0)
        print("Condition met..")
        # return await self.subscription_activities.cancel()

    def renew_subscription(self):
        self.quota = QUOTA

    async def decrement(self):
        self.quota = self.quota - 1

    async def get_quota(self):
        return self.quota


if __name__ == '__main__':
    factory = WorkerFactory("localhost", 7933, DOMAIN)
    worker = factory.new_worker(TASK_LIST)
    worker.register_activities_implementation(SubscriptionActivityImpl(), "SubscriptionActivity")
    worker.register_workflow_implementation_type(SubscriptionWf)
    factory.start()

    client = WorkflowClient.new_client(domain=DOMAIN)
    subs_workflow: SubscriptionWf = client.new_workflow_stub(SubscriptionWfInterface)

    wf_execution = client.start(subs_workflow.manage_subscription, "tddd3wsdsasdassdaeqsdsaw")
    time.sleep(5)
    subs_workflow2: SubscriptionWf = client.new_workflow_stub_from_workflow_id(SubscriptionWfInterface,
                                                                               wf_execution.workflow_execution.workflow_id)
    subs_workflow2.decrement()
    time.sleep(5)
    subs_workflow2.get_quota()
    subs_workflow2.decrement()
    subs_workflow2.decrement()
    subs_workflow2.decrement()
    subs_workflow2.get_quota()
    subs_workflow2.decrement()
    subs_workflow2.get_quota()
    # subs_workflow2.decrement()
    # time.sleep(1)
    # worker.stop()
    # print("Workers stopped...")
    # sys.exit(0)

In the above dummy code , If I try to invoke return await self.subscription_activities.cancel(), that throws errors such as:

DEBUG:cadence.decision_loop:[signal-task-WorkflowExecution(workflow_id='3b1cd958-4af4-4f7b-9446-af7d489be482', run_id='e9c472e6-693c-4529-8265-e8c204a9a6e2')-SubscriptionWfInterface::decrement] Created
DEBUG:cadence.decision_loop:[signal-task-WorkflowExecution(workflow_id='3b1cd958-4af4-4f7b-9446-af7d489be482', run_id='e9c472e6-693c-4529-8265-e8c204a9a6e2')-SubscriptionWfInterface::decrement] Running
INFO:cadence.decision_loop:Invoking signal SubscriptionWfInterface::decrement()
INFO:cadence.decision_loop:Signal SubscriptionWfInterface::decrement() returned None
Started workflow for tddd3wsdsasdassdaeqsdsaw
3b1cd958-4af4-4f7b-9446-af7d489be482
Condition met..
DEBUG:cadence.decision_loop:RespondDecisionTaskCompleted: RespondDecisionTaskCompletedResponse(decision_task=None)
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<SignalMethodTask.signal_main() done, defined at /Users/tsharma/PycharmProjects/twilio_whatsapp/venv/lib/python3.7/site-packages/cadence/decision_loop.py:320> exception=CancelledError()>
concurrent.futures._base.CancelledError
ERROR:asyncio:Task exception was never retrieved```

not sure what's happening here, I've tried multiple ways but still stuck,

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions