0

AWS が提供する Java フロー フレームワークを使用してワークフローを構築しました。4 つのアクティビティを作成しました。最初のアクティビティーは、シグナルが開始されるのを待ちます。次に、すべてのアクティビティが Promise<> オブジェクトを使用して同期的に実行されます。ワークフローの実装コードは次のとおりです。

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);
   }


}

ここでアクティビティ Upload は、オブジェクトの結果が準備完了状態になるのを待ちます。したがって、ワークフローにシグナルを送ると、メソッド signal1 が開始され、オブジェクトが準備完了状態になります。しかし、ワークフローに信号を送るとすぐに、ワークフローの実行が失敗します。

ワークフローを通知するために nodejs aws api を使用しています。以下は同じコードです-

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
});

そして、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;", []]
}]

誰でもこのエラーで私を助けてくれませんか、よろしくお願いします。

4

2 に答える 2

0

デフォルトでは、シグナル引数を逆シリアル化できない場合、ワークフローの実行は失敗します。デフォルトでは、 JsonDataConverterは、 Jacksonの上に実装されているワークフロー ディサイダーによって使用されます。特定の形式の JSON ドキュメントが必要です。この形式を学習する最も簡単な方法は、生成された Java インターフェイスを使用してシグナルを送信し、ワークフローの履歴を確認することです。その後、JavaScript コードでそれを再現できます。

于 2015-03-30T18:30:45.907 に答える
0

ワークフローは、json として文字列に変換できるオブジェクトの配列の入力を想定しています。

于 2015-03-31T02:26:24.410 に答える