

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# HelloWorldWorkflowAsync Aplikasi
<a name="getting-started-example-helloworldworkflowasync"></a>

Terkadang, sebaiknya alur kerja melakukan tugas tertentu secara lokal alih-alih menggunakan aktivitas. Namun, tugas alur kerja sering melibatkan pengolahan nilai-nilai yang diwakili oleh objek `Promise<T>`. Jika Anda meneruskan objek `Promise<T>` ke metode alur kerja sinkron, metode mengeksekusi segera tetapi tidak dapat mengakses nilai objek `Promise<T>` objek siap. Anda bisa melakukan polling `Promise<T>.isReady` sampai kembali `true`, tapi itu tidak efisien dan metode mungkin memblokir untuk waktu yang lama. Pendekatan yang lebih baik adalah dengan menggunakan *asynchronous method* (metode asinkron).

Metode asinkron diimplementasikan seperti metode standar—sering sebagai anggota kelas implementasi alur kerja—dan berjalan dalam konteks implementasi alur kerja. Anda menetapkan sebagai metode asinkron dengan menerapkan anotasi `@Asynchronous`, yang mengarahkan kerangka kerja untuk memperlakukannya seperti suatu aktivitas.
+ Ketika implementasi alur kerja memanggil metode asinkron, alur kerja kembali dengan segera. Metode asinkron biasanya mengembalikan objek `Promise<T>`, yang telah siap ketika metode selesai.
+ Jika Anda melewati metode asinkron satu atau lebih objek `Promise<T>`, metode menunda eksekusi sampai semua objek masukan siap. Sebuah metode asinkron karena itu dapat mengakses input nilai `Promise<T>` tanpa mempertaruhkan pengecualian.

**catatan**  
Karena cara AWS Flow Framework untuk Java mengeksekusi alur kerja, metode asinkron biasanya dijalankan beberapa kali, jadi Anda harus menggunakannya hanya untuk tugas-tugas overhead rendah cepat. Anda harus menggunakan aktivitas untuk melakukan tugas-tugas yang panjang seperti komputasi large. Untuk detail selengkapnya, lihat [AWS Flow Framework Konsep Dasar: Eksekusi Terdistribusi](awsflow-basics-distributed-execution.md).

Topik ini adalah panduan dari HelloWorldWorkflowAsync, versi modifikasi HelloWorldWorkflow yang menggantikan salah satu kegiatan dengan metode asinkron. Untuk mengimplementasikan aplikasi, buat salinan HelloWorld. HelloWorldWorkflow paket di direktori proyek Anda dan beri nama HelloWorld. HelloWorldWorkflowAsync. 

**catatan**  
Topik ini didasarkan pada konsep dan file yang disajikan di topik [HelloWorld Aplikasi](getting-started-example-helloworld.md) dan [HelloWorldWorkflow Aplikasi](getting-started-example-helloworldworkflow.md). Biasakan diri Anda dengan file dan konsep yang disajikan dalam topik tersebut sebelum melanjutkan.

Bagian berikut menjelaskan cara memodifikasi HelloWorldWorkflow kode asli untuk menggunakan metode asinkron.

## HelloWorldWorkflowAsync Implementasi Kegiatan
<a name="getting-started-example-helloworldworkflowasync.activities"></a>

HelloWorldWorkflowAsync mengimplementasikan antarmuka pekerja aktivitasnya di`GreeterActivities`, sebagai berikut:

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Activities;
import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions;

@Activities(version="2.0")
@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300,
                             defaultTaskStartToCloseTimeoutSeconds = 10)
public interface GreeterActivities {
   public String getName();
   public void say(String what);
}
```

Antarmuka ini mirip dengan yang digunakan oleh HelloWorldWorkflow, dengan pengecualian berikut:
+ Ini menghilangkan aktivitas `getGreeting`; tugas yang sekarang ditangani dengan metode asinkron.
+ Nomor versi diatur ke 2.0. Setelah Anda mendaftarkan antarmuka aktivitas dengan Amazon SWF, Anda tidak dapat memodifikasinya kecuali Anda mengubah nomor versi.

Implementasi metode aktivitas yang tersisa identik dengan HelloWorldWorkflow. Hapus saja `getGreeting` dari `GreeterActivitiesImpl`.

## HelloWorldWorkflowAsync Implementasi Alur Kerja
<a name="getting-started-example-helloworldworkflowasync.workflow"></a>

HelloWorldWorkflowAsync mendefinisikan antarmuka alur kerja sebagai berikut:

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Execute;
import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow;
import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions;

@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600)
public interface GreeterWorkflow {

   @Execute(version = "2.0")
   public void greet();
}
```

Antarmuka identik dengan HelloWorldWorkflow terpisah dari nomor versi baru. Seperti aktivitas, jika Anda ingin mengubah alur kerja terdaftar, Anda harus mengubah versinya.

HelloWorldWorkflowAsync mengimplementasikan alur kerja sebagai berikut:

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous;
import com.amazonaws.services.simpleworkflow.flow.core.Promise;

public class GreeterWorkflowImpl implements GreeterWorkflow {
   private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl();

   @Override
   public void greet() {
      Promise<String> name = operations.getName();
      Promise<String> greeting = getGreeting(name);
      operations.say(greeting);
   }

   @Asynchronous
   private Promise<String> getGreeting(Promise<String> name) {
      String returnString = "Hello " + name.get() + "!";
      return Promise.asPromise(returnString);
   }
}
```

HelloWorldWorkflowAsync menggantikan `getGreeting` aktivitas dengan metode `getGreeting` asinkron tetapi metode ini bekerja dengan `greet` cara yang hampir sama:

1. Eksekusi aktivitas `getName`, yang segera mengembalikan objek `Promise<String>`, `name`, yang mewakili nama.

1. Panggil metode asinkron `getGreeting` dan meneruskan objek `name`. `getGreeting` dengan segera mengembalikan objek `Promise<String>`, `greeting`, yang mewakili ucapan.

1. Eksekusi aktivitas `say` dan meneruskan objek `greeting`.

1. Saat `getName` lengkap, `name` telah siap dan `getGreeting` menggunakan nilainya untuk membangun ucapan.

1. Saat `getGreeting` lengkap, `greeting` telah siap dan `say` mencetak string ke konsol tersebut.

Perbedaannya adalah bahwa, daripada memanggil klien aktivitas untuk mengeksekusi aktivitas `getGreeting`, menyapa panggilan metode `getGreeting` asinkron. Hasil bersih adalah sama, tetapi metode `getGreeting` bekerja agak berbeda dari aktivitas `getGreeting`.
+ Pekerja alur kerja menggunakan semantik fungsi panggilan standar untuk mengeksekusi `getGreeting`. Namun, eksekusi asinkron aktivitas dimediasi oleh Amazon SWF.
+ `getGreeting` menjalankan di proses implementasi alur kerja.
+ `getGreeting` mengembalikan objek `Promise<String>` daripada objek `String`. Untuk mendapatkan nilai String yang dipegang oleh `Promise`, Anda menyebutnya metode `get()`. Namun, karena aktivitas dijalankan secara asinkron, nilai pengembaliannya mungkin tidak segera siap; `get()` akan memunculkan pengecualian hingga nilai pengembalian metode asinkron tersedia.

  Untuk informasi selengkapnya tentang cara kerja `Promise`, lihat [AWS Flow Framework Konsep Dasar: Data Exchange Antara Aktivitas dan Alur Kerja](awsflow-basics-data-exchange-activities-workflows.md).

`getGreeting` membuat nilai kembali dengan melewati string ucapan ke metode `Promise.asPromise`statis. Metode ini membuat objek `Promise<T>` dari jenis yang sesuai, menetapkan nilai, dan menempatkan dalam status siap.

## HelloWorldWorkflowAsync Alur Kerja dan Aktivitas Host dan Starter
<a name="getting-started-example-helloworldworkflowasync.host"></a>

HelloWorldWorkflowAsync mengimplementasikan `GreeterWorker` sebagai kelas host untuk alur kerja dan implementasi aktivitas. Ini identik dengan HelloWorldWorkflow implementasi kecuali untuk `taskListToPoll` nama, yang diatur ke "`HelloWorldAsyncList`”.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient;
import com.amazonaws.services.simpleworkflow.flow.ActivityWorker;
import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker;

public class GreeterWorker {
    public static void main(String[] args) throws Exception {
        ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000);

        String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID");
        String swfSecretKey = System.getenv("AWS_SECRET_KEY");
        AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey);

        AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config);
        service.setEndpoint("https://swf.us-east-1.amazonaws.com");

        String domain = "helloWorldWalkthrough";
        String taskListToPoll = "HelloWorldAsyncList";

        ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll);
        aw.addActivitiesImplementation(new GreeterActivitiesImpl());
        aw.start();

        WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll);
        wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class);
        wfw.start();
    }
}
```

HelloWorldWorkflowAsync mengimplementasikan alur kerja starter di`GreeterMain`; itu identik dengan implementasi. HelloWorldWorkflow 

Untuk menjalankan alur kerja, jalankan `GreeterWorker` dan`GreeterMain`, seperti halnya HelloWorldWorkflow.