Latihan - Menambahkan durable timer untuk mengelola tugas yang berjalan lama

Selesai

Dalam skenario contoh, Anda telah diminta untuk mengubah alur kerja baru Anda untuk menggabungkan langkah eskalasi untuk mengambil tindakan jika proposal desain proyek tidak disetujui secara tepat waktu.

Dalam latihan ini, Anda akan menambahkan timer untuk mengontrol waktu habis selama eksekusi alur kerja Anda. Anda juga akan mempelajari cara menggunakan batas waktu untuk mengontrol jalur eksekusi mana yang diperlukan alur kerja.

Menambahkan paket npm momen ke aplikasi fungsi Anda

Sebelum mengubah alur kerja, kami akan menambahkan paket npm momen ke aplikasi fungsi kami melalui konsol.

  1. Masuk ke portal Microsoft Azure menggunakan akun yang sama yang digunakan untuk mengaktifkan sandbox.

  2. Pada menu portal Azure atau dari halaman Beranda, pada Layanan Azure, pilih Semua sumber daya, lalu pilih aplikasi fungsi yang Anda buat di latihan sebelumnya. Panel Aplikasi Fungsi akan muncul.

  3. Di bilah menu sebelah kiri, pada Alat Pengembangan, pilih Konsol. Panel Konsol muncul untuk aplikasi fungsi Anda.

  4. Pastikan jendela konsol terbuka di folder C:\home\site\wwwroot, lalu jalankan perintah berikut guna menginstal pustaka yang diperlukan untuk aplikasi fungsi sampel ini.

    1. Jalankan perintah berikut untuk menginstal pustaka TypeScript , yang merupakan dependensi yang diperlukan untuk pengetikan statis.

      npm install typescript
      
    2. Jalankan perintah berikut untuk menginstal pustaka momen, yang berisi fungsi tanggal/waktu yang dapat Anda gunakan dengan fungsi tahan lama.

      npm install moment
      

      Perintah ini mungkin membutuhkan waktu beberapa detik untuk diselesaikan, dan manajer paket simpul mungkin menampilkan beberapa peringatan, yang dapat Anda abaikan.

  5. Tunggu hingga semua paket selesai diinstal, lalu tutup jendela konsol.

Menambahkan aktivitas eskalasi ke aplikasi fungsi

  1. Pada menu portal Azure atau dari halaman Beranda, pada Layanan Azure, pilih Semua sumber daya, lalu pilih aplikasi fungsi Anda. Panel Aplikasi Fungsi akan muncul.

  2. Pilih tab Fungsi di tengah layar.

  3. Di bilah menu tab Fungsi , pilih Buat. Panel Buat fungsi muncul.

  4. Di bawah Pilih templat, dalam kotak Filter , masukkan aktivitas Durable Functions dan pilih templat tersebut dari daftar. Templat ini membuat fungsi tahan lama yang dijalankan saat aktivitas dipanggil oleh fungsi orkestrator.

  5. Pada Detail templat, untuk bidang Fungsi Baru, masukkan Eskalasi untuk nama fungsi, dan pilih Buat. Panel eskalasi muncul untuk fungsi Anda.

  6. Di panel menu kiri, pada Pengembang, pilih Kode + Uji. Panel Kode + Uji akan muncul untuk fungsi Anda.

    Kode untuk file index.js muncul di editor.

  7. Ganti kode yang ada dengan kode berikut:

    module.exports = async function (context) {
        return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  ${context.bindings.name}!`;
    };
    

    Kode ini mengembalikan pesan yang menandakan bahwa alur kerja telah ditingkatkan. Dalam sistem produksi, fungsi ini akan berisi logika untuk mengingatkan penerima, atau menetapkan ulang tugas.

  8. Di bilah menu atas, pilih Simpan untuk menyimpan fungsi baru Anda.

Memperbarui fungsi orkestrasi untuk menggunakan fungsi eskalasi

  1. Pada menu portal Azure atau dari halaman Beranda, pada Layanan Azure, pilih Semua sumber daya, lalu pilih aplikasi fungsi Anda. Panel Aplikasi Fungsi akan muncul.

  2. Pilih tab Fungsi di tengah layar.

  3. Pilih fungsi OrchFunction yang Anda buat di latihan sebelumnya. Panel fungsi OrchFunction muncul.

  4. Di panel menu kiri, pada Pengembang, pilih Kode + Uji. Panel Kode + Uji akan muncul untuk fungsi Anda.

    Kode untuk file index.js muncul di editor.

  5. Tambahkan referensi berikut ke pustaka momen.

    const moment = require("moment");
    
  6. Ganti isi fungsi dengan kode berikut, yang akan menguji apakah tenggat waktu untuk persetujuan telah terlewati.

    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
        const deadline = moment.utc(context.df.currentUtcDateTime).add(20, "s");
        const activityTask = context.df.waitForExternalEvent("Approval");
        const timeoutTask = context.df.createTimer(deadline.toDate());
    
        const winner = yield context.df.Task.any([activityTask, timeoutTask]);
        if (winner === activityTask) {
            outputs.push(yield context.df.callActivity("Approval", "Approved"));
        }
        else
        {
            outputs.push(yield context.df.callActivity("Escalation", "Head of department"));
        }
    
        if (!timeoutTask.isCompleted) {
            // All pending timers must be complete or canceled before the function exits.
            timeoutTask.cancel();
        }
    
        return outputs;
    });
    

    Untuk mempersingkat tujuan latihan ini, jika fungsi Persetujuan tidak merespons dalam 20 detik, fungsi Eskalasi dipanggil. Kode tersebut juga mengubah panggilan Persetujuan untuk menunggu input eksternal. Dengan cara ini, kita dapat mengontrol kapan respons kembali untuk tujuan pengujian.

  7. Di bilah menu atas, pilih Simpan.

Memverifikasi bahwa alur kerja Durable Functions dimulai

  1. Pada menu portal Azure atau dari halaman Beranda, pada Layanan Azure, pilih Semua sumber daya, lalu pilih aplikasi fungsi Anda. Panel Aplikasi Fungsi akan muncul.

  2. Pada panel Ringkasan, di bilah menu atas, pilih Mulai ulang, lalu pilih Ya saat diminta untuk memulai ulang. Tunggu hingga mulai ulang selesai sebelum melanjutkan. Panel Aplikasi Fungsi Anda muncul kembali.

  3. Pilih tab Fungsi di tengah layar.

  4. Pilih fungsi HttpStart. Panel HttpStart muncul.

  5. Di bilah menu atas, pilih Dapatkan Url Fungsi, dan salin URL-nya. URL Anda harus menyerupai contoh berikut:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Anda akan menggunakan URL ini untuk menjalankan fungsi Anda.

  6. Buka jendela browser baru, dan arahkan ke URL yang Anda salin. Di URL, ganti tempat penampung {functionName} dengan OrchFunction, yang harus menyerupai contoh berikut:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Pesan respons berisi sekumpulan titik akhir URI yang dapat Anda gunakan untuk memantau dan mengelola eksekusi, yang harus menyerupai contoh berikut:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  7. Salin nilai statusQueryGetUri dan gunakan browser web Anda untuk menavigasi ke URL tersebut. Anda akan melihat pesan respons yang menunjukkan status sebagai Berjalan saat menunggu timer menghitung mundur hingga 20 detik, yang akan menyerupai contoh berikut:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Running",
      "input": null,
      "customStatus": null,
      "output": null,
      "createdTime": "2019-04-14T13:17:26Z",
      "lastUpdatedTime": "2019-04-14T13:17:27Z"
    }
    
  8. Tunggu selama 20 detik dan refresh jendela browser. Batas waktu akan tercapai, dan alur kerja akan memanggil aktivitas Escalate. Anda akan melihat respons yang harus menyerupai contoh berikut:

    {
        "name": "OrchFunction",
        "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  Head of department!"
        ],
        "createdTime": "2019-04-14T13:43:09Z",
        "lastUpdatedTime": "2019-04-14T13:43:31Z"
    }