简体   繁体   English

等待信号开始活动(amazon工作流程)

[英]Wait for signal to start activity (amazon Workflow)

I have built a workflow using java flow framework provided by AWS. 我已经使用AWS提供的java流框架构建了工作流。 I have created 4 activities. 我创建了4个活动。 First activity wait for signal to start. 第一个活动等待信号开始。 Then all the activities execute synchronously using Promise<> object. 然后,所有活动都使用Promise <>对象同步执行。 Workflow implementation code is following- 工作流程实现代码如下-

public class PaginationWorkflowImpl implements PaginationWorkflow 
{  
private ManualUploadClient operations0 = new ManualUploadClientImpl();
   private DownloadActivityClient operations1 = new DownloadActivityClientImpl();
   private ConvertActivityClient operations2 = new ConvertActivityClientImpl();
   private UploadActivityClient operations3 = new UploadActivityClientImpl();
   final Settable<String> result = new Settable<String>();

   public void paginate() 
   {
     Promise<String> UDone = operations0.Upload(result);
     Promise<String> dnDone = operations1.s3Download(UDone);
     Promise<String> convDone = operations2.pdfToTiff(dnDone);
     operations3.s3Upload(convDone);
   }

   @Override
   public void signal1(String data)  {
      // result.set(data);
       //result.Void();
       Promise<String> ready = Promise.asPromise("ready");
       result.chain(ready);
   }


}

Here activity Upload wait for the object result to be in ready state. 此处的活动上载等待对象结果处于就绪状态。 So when I signal workflow the method signal1 kicks off and puts the object in ready state. 因此,当我向工作流程发出信号时,方法signal1开始,并将对象置于就绪状态。 But as soon as I signal the workflow, workflow execution get failed. 但是,一旦我通知工作流程,工作流程执行就会失败。

I am using nodejs aws api to signal workflow. 我正在使用nodejs aws api来指示工作流。 Below is the code for the same- 以下是相同的代码-

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: '', secretAccessKey: ''});
AWS.config.update({region: 'us-east-1'});

var swf = new AWS.SWF();
var params = {
  domain: 'HWdemo2', /* required */
  signalName: 'signal1', /* required */
  workflowId: 'PaginationWorkflow', /* required */
  //input: 'true'
  //runId: 'STRING_VALUE'
};
swf.signalWorkflowExecution(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

And the error which I is showing in AWS workflow events console for execution fail is following- 我在AWS工作流事件控制台中显示的执行失败的错误如下-

 ["java.util.concurrent.CancellationException", { "cause": ["java.lang.NullPointerException", { "cause": null, "stackTrace": [{ "methodName": "<init>", "fileName": null, "lineNumber": -1, "className": "java.io.StringReader", "nativeMethod": false }, { "methodName": "createParser", "fileName": "JsonFactory.java", "lineNumber": 835, "className": "com.fasterxml.jackson.core.JsonFactory", "nativeMethod": false }, { "methodName": "readValue", "fileName": "ObjectMapper.java", "lineNumber": 2098, "className": "com.fasterxml.jackson.databind.ObjectMapper", "nativeMethod": false }, { "methodName": "fromData", "fileName": "JsonDataConverter.java", "lineNumber": 96, "className": "com.amazonaws.services.simpleworkflow.flow.JsonDataConverter", "nativeMethod": false }, { "methodName": "signalRecieved", "fileName": "POJOWorkflowDefinition.java", "lineNumber": 111, "className": "com.amazonaws.services.simpleworkflow.flow.pojo.POJOWorkflowDefinition", "nativeMethod": false }, { "methodName": "doExecute", "fileName": "AsyncDecider.java", "lineNumber": 417, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecider$1", "nativeMethod": false }, { "methodName": "", "fileName": "", "lineNumber": 0, "className": "--- continuation ---", "nativeMethod": false }, { "methodName": "handleWorkflowExecutionSignaled", "fileName": "AsyncDecider.java", "lineNumber": 413, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecider", "nativeMethod": false }, { "methodName": "processEvent", "fileName": "AsyncDecider.java", "lineNumber": 251, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecider", "nativeMethod": false }, { "methodName": "decide", "fileName": "AsyncDecider.java", "lineNumber": 496, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecider", "nativeMethod": false }, { "methodName": "handleDecisionTask", "fileName": "AsyncDecisionTaskHandler.java", "lineNumber": 50, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecisionTaskHandler", "nativeMethod": false }, { "methodName": "pollAndProcessSingleTask", "fileName": "DecisionTaskPoller.java", "lineNumber": 201, "className": "com.amazonaws.services.simpleworkflow.flow.worker.DecisionTaskPoller", "nativeMethod": false }, { "methodName": "run", "fileName": "GenericWorker.java", "lineNumber": 94, "className": "com.amazonaws.services.simpleworkflow.flow.worker.GenericWorker$PollServiceTask", "nativeMethod": false }, { "methodName": "runWorker", "fileName": null, "lineNumber": -1, "className": "java.util.concurrent.ThreadPoolExecutor", "nativeMethod": false }, { "methodName": "run", "fileName": null, "lineNumber": -1, "className": "java.util.concurrent.ThreadPoolExecutor$Worker", "nativeMethod": false }, { "methodName": "run", "fileName": null, "lineNumber": -1, "className": "java.lang.Thread", "nativeMethod": false }], "message": null, "localizedMessage": null, "suppressed": ["[Ljava.lang.Throwable;", []] }], "stackTrace": [{ "methodName": "execute", "fileName": "POJOWorkflowDefinition.java", "lineNumber": 66, "className": "com.amazonaws.services.simpleworkflow.flow.pojo.POJOWorkflowDefinition", "nativeMethod": false }, { "methodName": "doAsync", "fileName": "AsyncDecider.java", "lineNumber": 70, "className": "com.amazonaws.services.simpleworkflow.flow.worker.AsyncDecider$WorkflowExecuteAsyncScope", "nativeMethod": false }], "message": null, "localizedMessage": null, "suppressed": ["[Ljava.lang.Throwable;", []] }] 

Can anyone please help me out with this error, Thanks a lot in advance. 任何人都可以帮我解决这个错误,在此先多谢。

By default workflow execution fails if it cannot deserialize the signal arguments. 默认情况下,如果工作流无法反序列化信号参数,则执行失败。 By default JsonDataConverter is used by workflow decider which is implemented on top of Jackson . 默认情况下,工作流程决定程序使用JsonDataConverter ,该工作程序在Jackson之上实现。 It expects JSON document in a specific format. 它期望使用特定格式的JSON文档。 The simplest way to learn this format is to send signal using the generated Java interface and look at the workflow history. 学习这种格式的最简单方法是使用生成的Java接口发送信号并查看工作流程历史记录。 Then you can just reproduce it in your JavaScript code. 然后,您可以仅在JavaScript代码中重现它。

工作流期望输入对象数组,该对象数组可以转换为json字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM