2016-11-24 102 views
0

我是AWS SWF的新手,尝试创建一些活动,工作流和工作流启动器。 我发现了很多例子,在他们的帮助下,我现在可以注册一个域,创建一些活动并创建一个工作流,但是我无法编写一个程序来启动我的工作流执行。如何编写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(); 
    } 

} 

Aftere运行Host.java,我能看到在AWS控制台,但如何触发我的工作流程,我无法弄清楚我的活动和工作流程。

有人可以帮我在这里。

回答

0

使用产生的外部客户端开始工作流执行:

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

我建议要通过AWS流程框架ExamplesRecipes,因为它们包含工作端到端的各种方案的示例。

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

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

+0

谢谢你的帮助。我指的是相同的例子。我检查了helloworld示例,并在WorkflowExecutionStarter.java类中引用了BookingWorkflowClientExternalFactory clientFactory,它没有位于src文件夹中的任何位置,我无法从它的来源找到它... – user3541321

+0

我已经更新了答案,并链接到安装说明。 –