【问题标题】:How to write a swf starter program如何编写一个 swf 启动程序
【发布时间】:2017-04-08 07:40:06
【问题描述】:

我是 AWS SWF 的新手,正在尝试创建一些活动、工作流和工作流启动器。 我找到了许多示例,在它们的帮助下,我现在能够注册域、创建一些活动并创建工作流,但我无法编写一个程序来启动我的工作流执行。

有人可以在这里帮助我吗?以下是我到目前为止的代码:

ActivityWorker.java:

@Activities
@ActivityRegistrationOptions(
    defaultTaskHeartbeatTimeoutSeconds = FlowConstants.NONE, 
    defaultTaskScheduleToCloseTimeoutSeconds = 300, 
    defaultTaskScheduleToStartTimeoutSeconds = FlowConstants.NONE, 
    defaultTaskStartToCloseTimeoutSeconds = 300)
public interface ActivityWorker {
@Activity(name = "swftest1", version = "1.0")
@ExponentialRetry(
        initialRetryIntervalSeconds=10,
        backoffCoefficient=1,
        maximumAttempts=5)
public String print() throws IOException;


@Activity(name = "swftest2", version = "1.0")
@ExponentialRetry(
        initialRetryIntervalSeconds=10,
        backoffCoefficient=1,
        maximumAttempts=5)
public String print2() throws IOException;

}

ActivityWorkerImpl.java

public class ActivityWorkerImpl implements ActivityWorker{

@Override
public String print() throws IOException {
    System.out.println("Hello..");
    return "Printing..";
}

@Override
public String print2() throws IOException {
    System.out.println("Hello..");
    return "Printing2..";
}
}

Worker.java

@Workflow
@WorkflowRegistrationOptions(
    defaultExecutionStartToCloseTimeoutSeconds = 600, 
    defaultTaskStartToCloseTimeoutSeconds = 300)
public interface Worker {
@Execute(version = "1.0", name="worker1")
public void greet();

}

WorkerImpl.java

public class WorkerImpl implements Worker{

private final ActivityWorkerImpl actWorkerImpl = new ActivityWorkerImpl();

@Override
public void greet() {
    new TryCatchFinally() {
        @Override
        protected void doTry() throws Throwable {
            String res= downloadFromS3();
            System.out.println("res.."+res);
        }

        @Override
        protected void doCatch(Throwable e) throws Throwable {
            throw e;
        }

        @Override
        protected void doFinally() throws Throwable {
            // noop
        }
    };
}


@Asynchronous
private String downloadFromS3() throws IOException {
    return this.actWorkerImpl.print();
}

}

Host.java

public class ActivityHost {

    public static void main(String[] args) throws Exception {

          String domain = "test1";
          String taskListToPoll = "HelloWorldList";

         ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000);

         String swfAccessId = "myid";
         String swfSecretKey = "mysecretekey";
         AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey);

       AmazonSimpleWorkflow swf = new AmazonSimpleWorkflowClient(awsCredentials, config);

        ActivityWorker activityworker = new ActivityWorker(swf, domain, taskListToPoll);
        //adding activity
        activityworker.addActivitiesImplementation(new ActivityWorkerImpl());

        activityworker.start();

        //adding workflow
        WorkflowWorker worker = new WorkflowWorker(swf,domain, taskListToPoll);

        worker.addWorkflowImplementationType(WorkerImpl.class);

        worker.start();
    }

}

在运行 Host.java 之后,我可以在 aws 控制台中看到我的活动和工作流,但是如何触发我无法弄清楚的工作流。

谁能帮帮我。

【问题讨论】:

    标签: java amazon-web-services aws-sdk amazon-swf


    【解决方案1】:

    使用生成的外部客户端启动工作流执行:

    WorkerClientExternalFactory f = new WorkerClientExternalFActory (swf, domain);
    WorkerClientExternal w = f.getClient();
    w.greet();
    

    我建议使用 AWS Flow Framework ExamplesRecipes,因为它们包含适用于各种场景的端到端工作示例。

    在您的代码中,您有一个返回字符串的@Asynchronous 方法。这是不允许的,因为这种方法必须返回 void 或 Promise。您的工作流代码不应该直接引用活动实现,而只能通过生成的客户端。

    编辑: 工厂和客户端由注释处理器生成。按照"Setting up the AWS Flow Framework for Java" 文档中关于启用代码生成的说明进行操作。

    【讨论】:

    • 感谢您的帮助。我指的是相同的例子。我检查了 helloworld 示例,在 WorkflowExecutionStarter.java 类中,它指的是 BookingWorkflowClientExternalFactory clientFactory,它不在 src 文件夹中,我无法弄清楚它来自哪里......
    • 我已经用安装说明的链接更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2014-05-26
    • 2021-12-14
    • 2010-11-01
    相关资源
    最近更新 更多