2016-11-24 3 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 Flow Framework Examples и Recipes, поскольку они содержат работать встык примеры для различных сценариев.

В коде у вас есть @Asynchronous метод, который возвращает строку. Это не допускается, поскольку такой метод должен либо возвращать void, либо Promise. Ваш код рабочего процесса никогда не должен ссылаться на реализацию операции напрямую, но только через сгенерированный клиент.

Редактировать: Завод и клиенты генерируются обработчиком аннотаций. Следуйте инструкциям из документа "Setting up the AWS Flow Framework for Java" о создании кода.

+0

Благодарим за помощь. Я имел в виду те же примеры. Я проверил пример helloworld и в классе WorkflowExecutionStarter.java ссылается на BookingWorkflowClientExternalFactory clientFactory, которого нет в папке src, и я не могу понять, откуда он пришел ... – user3541321

+0

Я обновил ответ со ссылкой на инструкции по установке. –