Memahami Correlation Di Windows Workflow Foundation (WF)


Pada saat memakai WF untuk menyediakan layanan web service, correlation adalah sesuatu yang kerap dipakai. Correlation berkaitan dengan activity Receive dimana sebuah activity Receive akan diterjemahkan menjadi sebuah web service yang dapat dipanggil oleh client. Sebagai contoh, saya akan membuat sebuah proyek baru di Visual Studio 2010 dengan template Visual C# WCF Workflow Service Application.

Saya mulai dengan menghapus template workflow yang sudah ada dan membuat workflow sederhana baru untuk proses registrasi yang berisi activity ReceiveAndSendReply, seperti yang terlihat pada gambar berikut ini:

Membuat sebuah activity ReceiveAndSendReply

Membuat sebuah activity ReceiveAndSendReply

Saya membutuhkan beberapa variabel untuk menampung informasi registrasi, seperti yang terlihat pada gambar berikut ini:

Daftar variabel dalam workflow

Daftar variabel dalam workflow

Untuk menentukan parameter yang dibutuhkan pada saat service Daftar() dipanggil oleh client, saya men-klik tulisan View message… pada bagian Content dan mengisi dialog yang muncul agar terlihat seperti berikut ini:

Parameter untuk activity Receive Daftar()

Parameter untuk activity Receive Daftar()

Saya juga melakukan langkah yang sama untuk menentukan hasil kembalian dari service ini, dengan mengisi dialog yang muncul seperti berikut ini:

Nilai yang dikembalikan oleh service Daftar()

Nilai yang dikembalikan oleh service Daftar()

Selanjutnya, saya menambahkan sebuah activity ReceiveAndSendReply lagi dengan nama operasi Aktivasi. Saya mengisi parameternya seperti pada gambar berikut ini:

Parameter untuk activity Receive Aktivasi()

Parameter untuk activity Receive Aktivasi()

Saya mengisi content definition untuk hasil kembalian dari servce ini seperti yang terlihat pada gambar berikut ini:

Nilai yang dikembalikan oleh service Aktivasi()

Nilai yang dikembalikan oleh service Aktivasi()

Pada workflow sederhana ini, pengguna pertama kali memanggil service Daftar() untuk melakukan proses registrasi. Anggap saja ia kemudian menerima email beserta kode aktivasi yang akan memanggil service Aktivasi(). Workflow-nya akan terlihat seperti pada gambar berikut ini:

Hasil rancangan workflow

Hasil rancangan workflow

Bila saya menjalankan aplikasi ini, WcfClientTester.exe otomatis akan dijalankan dengan tampilan seperti yang terlihat pada gambar berikut ini:

Workflow services yang tersedia

Workflow services yang tersedia

Bila saya mencoba memanggil salah satu dari service Daftar() atau Aktivasi(), saya akan memperoleh pesan kesalahan seperti berikut ini:

There is no context attached to the incoming message for the service and the current operation is not marked with “CanCreateInstance = true”. In order to communicate with this service check whether the incoming binding supports the context protocol and has a valid context initialized.

Mengapa demikian? Apa itu workflow instance? Sama seperti satu atau lebih object adalah instance dari sebuah class, bisa terdapat satu atau lebih instance dari sebuah workflow. Sebagai contoh, proses registrasi untuk email solidsnake@gmail.com adalah instance yang berbeda dari proses registrasi untuk email liquidsnake@gmail.com, walaupun mereka berdasarkan workflow yang sama.

Bila instance dari object akan dibuat dengan keyword new, lalu kapan instance dari workflow akan dibuat? Jawabannya adalah pada saat sebuah activity dengan nilai property CanCreateInstance=true dipanggil. Biasanya ini adalah activity Receive yang didefinisikan pertama kali. Oleh sebab itu, saya mengatur nilai property CanCreateInstance menjadi true untuk activity tersebut seperti yang terlihat pada gambar berikut ini:

Mengatur nilai property CanCreateInstance

Mengatur nilai property CanCreateInstance

Sekarang, saya dapat memanggil operasi Daftar() dengan baik seperti yang terlihat pada gambar berikut ini:

Memanggil service Daftar()

Memanggil service Daftar()

Lalu bagaimana dengan operasi Aktivasi()? Pesan kesalahan tetap akan muncul. Tapi permasalahannya adalah bila saya memberi nilai CanCreateInstance=true pada activity tersebut, maka ia akan membuat instance workflow baru sama halnya seperti Daftar(). Akibatnya, Aktivasi() dapat dipanggil sebelum Daftar(). Padahal, harusnya Aktivasi() adalah bagian dari instance yang diciptakan oleh Daftar(). Permasalahan ini mirip seperti permasalahan session di aplikasi web. Apa yang harus saya lakukan agar operasi dapat dipanggil secara berurut?

Agar bisa mengenali setiap instance, WF memakai correlation untuk memetakan setiap request ke instance yang bersangkutan. Pada contoh ini, saya akan menggunakan content-based correlation dimana saya perlu mencari sebuah nilai unik yang menjadi pengenal instance workflow. Pada workflow proses registrasi yang saya buat, email adalah kandidat yang tepat untuk dipakai sebagai identitas sebuah instance workflow karena ia selalu unik untuk setiap instance.

Saya perlu melakukan inisialisasi nilai correlation dipakai sebagai pengenal workflow instance dengan mengisi nilai property CorrelationInitializers di activity Receive untuk operasi Daftar() dengan nilai seperti berikut ini:

Melakukan inisialisasi pengenal workflow instance

Melakukan inisialisasi pengenal workflow instance

Berikutnya, saya perlu mengatur correlation untuk activity Receive untuk service Aktivasi(). Caranya adalah dengan men-klik tombol di sisi kanan property CorrelatesOn dan mengisi dialog yang muncul dengan informasi seperti pada gambar berikut ini:

Mengatur nilai correlation

Mengatur nilai correlation

Sekarang, bila saya mengerjakan operasi Daftar() sebelum Aktivasi() dengan email yang sama, maka operasi Aktivasi() akan dikerjakan dengan baik, seperti yang terlihat pada gambar berikut ini:

Memanggil service Aktivasi()

Memanggil service Aktivasi()

Tapi bila saya memanggil Aktivasi() dengan sebuah email berbeda yang belum didaftarkan oleh Daftar(), maka saya akan memperoleh pesan kesalahan seperti berikut ini:

The execution of an InstancePersistenceCommand was interrupted because the instance key ‘6ec2e27e-9585-0253-0eb0-707d3d08dfbe’ was not associated to an instance. This can occur because the instance or key has been cleaned up, or because the key is invalid. The key may be invalid if the message it was generated from was sent at the wrong time or contained incorrect correlation data.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: