Tips Pemecahan Masalah dan Debugging - AWS Flow Framework untuk Java

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

Tips Pemecahan Masalah dan Debugging

Bagian ini menjelaskan beberapa jebakan umum yang mungkin Anda hadapi saat mengembangkan alur kerja menggunakan AWS Flow Framework untuk Java. Ini juga memberikan beberapa tips untuk membantu Anda mendiagnosis dan men-debug masalah.

Kesalahan Kompilasi

Jika Anda menggunakan opsi penenunan waktu kompilasi AspectJ, Anda mungkin mengalami kesalahan waktu kompilasi di mana penyusun tidak dapat menemukan kelas klien yang dihasilkan untuk alur kerja dan aktivitas Anda. Kemungkinan penyebab kesalahan kompilasi tersebut adalah bahwa pembuat AspectJ mengabaikan klien yang dihasilkan selama kompilasi. Anda dapat memperbaiki masalah ini dengan menghapus kemampuan AspectJ dari proyek dan mengaktifkannya kembali. Perhatikan bahwa Anda perlu melakukan ini setiap kali antarmuka alur kerja atau aktivitas Anda berubah. Karena masalah ini, kami menyarankan Anda untuk menggunakan opsi penenunan waktu unggah. Lihat bagian Menyiapkan AWS Flow Framework for Java untuk lebih jelasnya.

Kesalahan Sumber Daya yang Tidak Diketahui

Amazon SWF mengembalikan kesalahan sumber daya yang tidak diketahui saat Anda mencoba melakukan operasi pada sumber daya yang tidak tersedia. Penyebab umum untuk kesalahan ini adalah:

  • Anda mengonfigurasi pekerja dengan domain yang tidak ada. Untuk memperbaikinya, pertama-tama daftarkan domain menggunakan konsol Amazon SWF atau API layanan Amazon SWF.

  • Anda mencoba membuat eksekusi alur kerja atau tugas aktivitas jenis yang belum terdaftar. Ini dapat terjadi jika Anda mencoba membuat eksekusi alur kerja sebelum pekerja dijalankan. Karena pekerja mendaftarkan jenis mereka saat dijalankan untuk pertama kalinya, Anda harus menjalankannya setidaknya sekali sebelum mencoba memulai eksekusi (atau mendaftarkan jenis secara manual menggunakan Konsol tersebut atau API layanan). Perhatikan bahwa setelah jenis didaftarkan, Anda dapat membuat eksekusi meskipun tidak ada pekerja yang berjalan.

  • Seorang pekerja mencoba untuk menyelesaikan tugas yang telah habis waktunya. Misalnya, jika seorang pekerja membutuhkan waktu terlalu lama untuk memproses tugas dan melebihi batas waktu, itu akan mendapatkan UnknownResource kesalahan ketika mencoba menyelesaikan atau gagal tugas. Para AWS Flow Framework pekerja akan terus melakukan polling Amazon SWF dan memproses tugas-tugas tambahan. Namun, Anda harus mempertimbangkan untuk menyesuaikan batas waktu. Menyesuaikan batas waktu mengharuskan Anda mendaftarkan versi baru dari jenis aktivitas.

Pengecualian Saat Memanggil get() pada Promise

Tidak seperti Java Future, Promise adalah konstruksi non-pemblokiran dan memanggil get() pada Promise yang belum siap akan mengeluarkan pengecualian alih-alih memblokir. Cara yang benar untuk menggunakan Promise adalah dengan meneruskannya ke metode asinkron (atau tugas) dan mengakses nilainya dalam metode asinkron. AWS Flow Framework for Java memastikan bahwa metode asinkron dipanggil hanya ketika semua argumen Promise yang diteruskan ke metode tersebut telah siap. Jika Anda yakin kode Anda benar atau jika Anda mengalami ini saat menjalankan salah satu AWS Flow Framework sampel, maka kemungkinan besar karena aspectJ tidak dikonfigurasi dengan benar. Untuk detailnya, lihat bagian Menyiapkan AWS Flow Framework for Java.

Alur Kerja Non Deterministik

Seperti yang dijelaskan di bagian Nondeterminisme, implementasi alur kerja Anda harus bersifat deterministik. Beberapa kesalahan umum yang dapat menyebabkan nondeterminisme adalah penggunaan jam sistem, penggunaan angka acak, dan pembuatan GUID. Karena konstruksi ini dapat mengembalikan nilai yang berbeda pada waktu yang berbeda, aliran kontrol alur kerja Anda mungkin mengambil jalur yang berbeda setiap kali dijalankan (lihat bagian AWS Flow FrameworkKonsep Basic: Eksekusi Terdistribusi dan Di bawah Hood untuk detailnya). Jika kerangka kerja mendeteksi nondeterminisme saat menjalankan alur kerja, pengecualian akan dilemparkan.

Masalah Karena Versioning

Saat Anda mengimplementasikan versi baru alur kerja atau aktivitas Anda—misalnya, saat Anda menambahkan fitur baru—Anda harus meningkatkan versi tipe dengan menggunakan anotasi yang sesuai: @Workflow, @Activites, atau @Activity. Saat versi baru alur kerja di-deploy, sering kali Anda akan memiliki eksekusi dari versi yang sudah ada yang sudah berjalan. Oleh karena itu, Anda perlu memastikan bahwa pekerja dengan versi alur kerja dan aktivitas yang sesuai mendapatkan tugas. Anda dapat melakukannya dengan menggunakan kumpulan daftar tugas yang berbeda untuk setiap versi. Misalnya, Anda dapat menambahkan nomor versi ke nama daftar tugas. Ini memastikan bahwa tugas-tugas milik versi berbeda dari alur kerja dan aktivitas ditugaskan ke pekerja yang sesuai.

Memecahan Masalah dan Men-debug Eksekusi Alur Kerja

Langkah pertama dalam memecahkan masalah eksekusi alur kerja adalah menggunakan konsol Amazon SWF untuk melihat riwayat alur kerja. Riwayat alur kerja adalah catatan lengkap dan otoritatif dari semua peristiwa yang mengubah status eksekusi dari eksekusi alur kerja. Riwayat ini dikelola oleh Amazon SWF dan sangat berharga untuk mendiagnosis masalah. Konsol Amazon SWF memungkinkan Anda mencari eksekusi alur kerja dan menelusuri peristiwa riwayat individu.

AWS Flow Framework menyediakan WorkflowReplayer kelas yang dapat Anda gunakan untuk memutar ulang eksekusi alur kerja secara lokal dan men-debugnya. Dengan menggunakan kelas ini, Anda dapat men-debug tertutup dan menjalankan eksekusi alur kerja. WorkflowReplayerbergantung pada riwayat yang disimpan di Amazon SWF untuk melakukan pemutaran ulang. Anda dapat mengarahkannya ke eksekusi alur kerja di akun Amazon SWF Anda atau menyediakannya dengan peristiwa riwayat (misalnya, Anda dapat mengambil riwayat dari Amazon SWF dan membuat cerita bersambung secara lokal untuk digunakan nanti). Saat Anda memutar ulang eksekusi alur kerja menggunakan WorkflowReplayer, itu tidak memengaruhi eksekusi alur kerja yang berjalan di akun Anda. Pemutaran ulang dilakukan sepenuhnya pada klien. Anda dapat men-debug alur kerja, membuat titik putus, dan memasukkan kode menggunakan alat debug seperti biasa. Jika Anda menggunakan Eclipse, pertimbangkan untuk menambahkan filter langkah untuk AWS Flow Framework memfilter paket.

Misalnya, cuplikan kode berikut dapat digunakan untuk memutar ulang eksekusi alur kerja:

String workflowId = "testWorkflow"; String runId = "<run id>"; Class<HelloWorldImpl> workflowImplementationType = HelloWorldImpl.class; WorkflowExecution workflowExecution = new WorkflowExecution(); workflowExecution.setWorkflowId(workflowId); workflowExecution.setRunId(runId); WorkflowReplayer<HelloWorldImpl> replayer = new WorkflowReplayer<HelloWorldImpl>( swfService, domain, workflowExecution, workflowImplementationType); System.out.println("Beginning workflow replay for " + workflowExecution); Object workflow = replayer.loadWorkflow(); System.out.println("Workflow implementation object:"); System.out.println(workflow); System.out.println("Done workflow replay for " + workflowExecution);

AWS Flow Framework juga memungkinkan Anda untuk mendapatkan dump thread asinkron dari eksekusi alur kerja Anda. Pembuangan utas ini memberi Anda tumpukan panggilan dari semua tugas asinkron terbuka. Informasi ini dapat berguna untuk menentukan tugas mana dalam eksekusi yang tertunda dan mungkin macet. Sebagai contoh:

String workflowId = "testWorkflow"; String runId = "<run id>"; Class<HelloWorldImpl> workflowImplementationType = HelloWorldImpl.class; WorkflowExecution workflowExecution = new WorkflowExecution(); workflowExecution.setWorkflowId(workflowId); workflowExecution.setRunId(runId); WorkflowReplayer<HelloWorldImpl> replayer = new WorkflowReplayer<HelloWorldImpl>( swfService, domain, workflowExecution, workflowImplementationType); try { String flowThreadDump = replayer.getAsynchronousThreadDumpAsString(); System.out.println("Workflow asynchronous thread dump:"); System.out.println(flowThreadDump); } catch (WorkflowException e) { System.out.println("No asynchronous thread dump available as workflow has failed: " + e); }

Tugas Hilang

Terkadang Anda mungkin menutup pekerja dan memulai yang baru secara berurutan hanya untuk mengetahui bahwa tugas terkirim ke pekerja lama. Hal ini dapat terjadi karena kondisi balapan dalam sistem, yang didistribusikan di beberapa proses. Masalahnya juga dapat muncul saat Anda menjalankan pengujian unit dalam lingkaran yang ketat. Menghentikan pengujian di Eclipse terkadang juga dapat menyebabkan hal ini karena penangan shutdown mungkin tidak dipanggil.

Untuk memastikan bahwa masalahnya sebenarnya karena pekerja lama mendapatkan tugas, Anda harus melihat riwayat alur kerja untuk menentukan proses mana yang menerima tugas yang Anda harapkan akan diterima pekerja baru. Misalnya, peristiwa DecisionTaskStarted dalam riwayat berisi identitas pekerja alur kerja yang menerima tugas. Id yang digunakan oleh Kerangka Kerja Alur berbentuk: {processId}@{host name}. Misalnya, berikut adalah detail peristiwa DecisionTaskStarted di konsol Amazon SWF untuk contoh eksekusi:

Stempel Waktu Acara

Sen 20 Feb 11:52:40 GMT-800 2012

Identitas

2276@ip-0A6C1DF5

Id Peristiwa Terjadwal

33

Untuk menghindari situasi ini, gunakan daftar tugas yang berbeda untuk setiap pengujian. Juga, pertimbangkan untuk menambahkan penundaan antara mematikan pekerja lama dan memulai yang baru.