Search code examples
javaamazon-web-servicesworkflowamazon-swf

Amazon Simple Workflow and child workflow


I am trying to run a childworkflow from a workflow in amazon simple workflow service using java flow framework for AWS. Below is the main workflow implementation code:

package SWF.ChildWorkFlow;

import org.springframework.core.annotation.Order;

import com.amazonaws.services.simpleworkflow.flow.core.Promise;

public class OrderWorkflowImpl implements OrderWorkflow {

    private OrderActivitiesClient client = new OrderActivitiesClientImpl();

    ProcessPaymentWorkflowClientFactory factory = new ProcessPaymentWorkflowClientFactoryImpl();

    @Override
    public void getCustomerOrder() {
        Promise<String> a = client.getOrder();


        ProcessPaymentWorkflowClient childWorkflowClient = factory.getClient("ChildWorkflow");
        childWorkflowClient.paymentProcessor(a);

    }

}

Activities from main workflows are running but activities from childorkflow(paymentProcessor) is running after it throws some error.

below is the error message-

Dec 08, 2014 3:11:21 PM com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler createDecider
SEVERE: Received decision task for workflow type not configured with a worker: workflowType={Name: OrderWorkflow.getCustomerOrder,Version: 1.1}, taskToken=AAAAKgAAAAIAAAAAAAAAAjtd06ct8IXpzt5gbkfiKHXQbZci9kmJuSq1rKtpPVW+l+7hhLESuQDt5e3oVobCfbjEhfrRae26bnGLV3Kz2zsOUDBxpMGlFGReCBKeUc9BNGzKyOj4uiX5bPMdvez6zn8/Xfy69KTARDWvy15EsoP/4fp/9z3t4XJkzuk/Ks857gvtfNEZ1RfnlBqaqv2i9hpVBgHQXeoly0soewELhUxdOWHhYOxsGnGnM/MsEPFaXwKgzqwddXfuco7Pho0qle2xViYudOs7wcEECfi2Tgw=, workflowExecution={WorkflowId: workflow,RunId: 22fW/b5Qf+8M5AYj7S2PHY9N74LQGlouoWwszAFXH8VFI=}
Dec 08, 2014 3:11:21 PM com.amazonaws.services.simpleworkflow.flow.worker.DecisionTaskPoller pollAndProcessSingleTask
WARNING: DecisionTask failure: taskId= 9, workflowExecution={WorkflowId: workflow,RunId: 22fW/b5Qf+8M5AYj7S2PHY9N74LQGlouoWwszAFXH8VFI=}
java.lang.IllegalArgumentException: No implementation was found for {Name: OrderWorkflow.getCustomerOrder,Version: 1.1}
    at com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler.createDecider(AsyncDecisionTaskHandler.java:111)
    at com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler.handleDecisionTask(AsyncDecisionTaskHandler.java:49)
    at com.amazonaws.services.simpleworkflow.flow.worker.DecisionTaskPoller.pollAndProcessSingleTask(DecisionTaskPoller.java:201)
    at com.amazonaws.services.simpleworkflow.flow.worker.GenericWorker$PollServiceTask.run(GenericWorker.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Dec 08, 2014 3:11:21 PM com.amazonaws.services.simpleworkflow.flow.worker.GenericWorker uncaughtException
SEVERE: Failure in thread SWF Decider HelloWorldListParallel 1
java.lang.IllegalArgumentException: No implementation was found for {Name: OrderWorkflow.getCustomerOrder,Version: 1.1}
    at com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler.createDecider(AsyncDecisionTaskHandler.java:111)
    at com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler.handleDecisionTask(AsyncDecisionTaskHandler.java:49)
    at com.amazonaws.services.simpleworkflow.flow.worker.DecisionTaskPoller.pollAndProcessSingleTask(DecisionTaskPoller.java:201)
    at com.amazonaws.services.simpleworkflow.flow.worker.GenericWorker$PollServiceTask.run(GenericWorker.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Could anyone please help me out in the problem. And I am also not able to find out any proper documentation on childworkflows in AWS SWF service on internet. Thanks in advance.


Solution

  • The exception means that the WorkflowWorker (decider) receives a decision task for a workflow it is not configured to run. My guess is that you have two WorkflowWorkers one for the parent and one for the child workflow that share the same task list name. And as the task list name is the same any of them can get tasks from the other. So the solution is either register both workflows with a single WorkflowWorker or use different task lists for each worker. Note that workflow version should be bumped if task list name is changed as workflow type properties are immutable once registered.