dapr / dapr

Dapr is a portable, event-driven, runtime for building distributed applications across cloud and edge.

Home Page:https://dapr.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Python SDK How to Retrigger Workflow

kpradp opened this issue · comments

 // fast api to call workflow 

  @router.get("/start_workflow")
  def start_workflow():
         
          logging.info("Starting workflow runtime...")
               
          with DaprClient() as d:
              workflow_runtime = WorkflowRuntime("localhost","3500")
              workflow_runtime = WorkflowRuntime()
               
              workflow_runtime.register_workflow(task_chain_workflow)
              workflow_runtime.register_activity(step1)
              workflow_runtime.register_activity(step2)
              workflow_runtime.register_activity(step3)
              workflow_runtime.start()
              
              logging.info('starting wfrnt taskchain')
              start_resp = d.start_workflow(instance_id= workflow_instance_id ,
                                            workflow_component= workflow_component ,
                                            workflow_name= workflow_name,
                                            input= 33,
                                            workflow_options=workflow_options
                                            
                                            )
              print(f'start_resp {start_resp.instance_id}')
              logger.info(f'start_resp {start_resp.instance_id}')
              
              get_response = d.get_workflow(
              instance_id=workflow_instance_id, workflow_component='dapr'
          )
              print(f'Get response from {workflow_name} after pause call: {get_response.runtime_status}')
              
              sleep(2)
              d.purge_workflow(instance_id=workflow_instance_id, workflow_component=workflow_component)
              try:
                  d.get_workflow(instance_id=workflow_instance_id, workflow_component=workflow_component)
              except DaprInternalError as err:
                  if non_existent_id_error in err._message:
                      print('Instance Successfully Purged')
              # d.purge_workflow(instance_id=workflow_instance_id,workflow_component=workflow_component)
              sleep(2)
              workflow_runtime.shutdown()
           
           
          return start_resp.instance_id  

I am triggering the Workflow from a fast api . It executes , all good.

moreover when i retrigger again its showing the error as

File "/usr/local/lib/python3.10/site-packages/dapr/ext/workflow/workflow_runtime.py", line 80, in register_workflow
workflow-service_1 | raise ValueError(f'Workflow {fn.name} already registered as {alt_name}')
workflow-service_1 | ValueError: Workflow task_chain_workflow already registered as task_chain_workflow

@kpradp

You only need register the workflow and acitvities once per lifetime of your process.

I'm not a python dev, but it looks like you may be registering the workflow and activities on every call to your /start_workflow endpoint?

workflow_runtime.register_workflow(task_chain_workflow)
workflow_runtime.register_activity(step1)
workflow_runtime.register_activity(step2)
workflow_runtime.register_activity(step3)

Thanks my bad i mixed few samples