Gabungkan pola Façade Sesi dengan XML

Pola desain Sesi Façade populer untuk mengembangkan aplikasi perusahaan berdasarkan J2EE (Java 2 Platform, Enterprise Edition). Ini tidak hanya memberlakukan desain arsitektur aplikasi yang dapat digunakan kembali tetapi juga memberikan banyak keuntungan, termasuk pengurangan overhead jaringan, manajemen keamanan terpusat dan kontrol transaksi, abstraksi kasar dari data bisnis dan objek layanan, dan mengurangi kopling antara klien dan objek bisnis.

Pola desain Session Façade harus dimiliki agar berhasil mengembangkan perangkat lunak dengan J2EE. Sulit untuk memutuskan bagaimana menggunakan Sesi Façade yang paling efektif dalam proyek tertentu. Ada banyak faktor yang perlu dipertimbangkan: persyaratan bisnis proyek, ruang lingkup proyek, dan kompleksitas, hanyalah beberapa di antaranya. Dalam kebanyakan situasi, pengembang menggunakan pola Sesi Façade dengan Value Object dan pola desain terkait lainnya, tetapi saya telah menemukan beberapa batasan pada pendekatan ini di beberapa proyek, terutama ketika membangun sistem yang besar dan kompleks.

Dalam artikel ini, pertama-tama saya akan memberikan pengantar pola desain Sesi Façade, manfaat yang dibawanya, serta pro dan kontra saat menggunakan Session Façade dengan pola Value Object. Kemudian saya akan menyajikan solusi alternatif: Sesi Façade dengan XML.

Ringkasan Sesi Façade

Pola desain Sesi Façade menggunakan kacang sesi perusahaan sebagai façade, yang mengabstraksi interaksi objek bisnis yang mendasarinya dan menyediakan lapisan akses layanan yang seragam dan berbutir kasar kepada klien.

Dalam aplikasi J2EE terdistribusi, aplikasi tingkat klien berinteraksi dengan server dengan bertukar data antara dirinya dan tingkat EJB (Enterprise JavaBeans). Karena overhead dari beberapa panggilan jaringan dan konkurensi yang buruk, ini bisa menjadi pembunuh kinerja jika aplikasi tingkat klien secara langsung memanggil beberapa metode terperinci pada komponen sesi / entitas EJB (yang saya sebut objek bisnis) di tingkat EJB aplikasi J2EE .

Pertimbangkan aplikasi perbankan J2EE, di mana pelanggan bank meminta teller bank untuk mentransfer uang dari rekening tabungannya ke rekening giro. Dalam skenario ini, aplikasi klien mandiri bank harus terlebih dahulu memvalidasi nasabah sebelum menarik uang dari rekening tabungan dan menyimpannya ke rekening giro. Diagram urutan pada Gambar 1 menunjukkan interaksi antara tingkat klien dan tingkat EJB.

Pendekatan ini memiliki dua kelemahan utama. Pertama, itu tidak berskala. Aplikasi klien harus melakukan panggilan jarak jauh ke setiap kacang perusahaan. Ada enam panggilan jaringan secara keseluruhan, seperti yang ditunjukkan pada diagram urutan Gambar 1.

Kelemahan kedua: Pendekatan ini memiliki konkurensi yang buruk. Aplikasi klien harus menggabungkan panggilan ke SavingAccountdan CheckingAccountdalam satu transaksi untuk menjaga akun pelanggan dalam keadaan yang konsisten. Transaksi akan diperpanjang lebih lama karena overhead jaringan, dan akibatnya, pendekatan ini meningkatkan kemungkinan kebuntuan dan mengurangi konkurensi.

Solusi untuk dilema desain kami adalah menambahkan lapisan abstraksi tingkat yang lebih tinggi antara aplikasi tingkat klien dan tingkat EJB menggunakan pola desain Sesi Façade, yang diimplementasikan sebagai kacang sesi. Diagram urutan pada Gambar 2 menunjukkan interaksi antara klien dan tingkatan EJB setelah kacang sesi Sesi Façade perbankan ditambahkan.

Dalam contoh kami, Sesi Façade mengurangi jumlah jaringan dari enam menjadi satu. Ditambah akses ke setiap kacang entitas sekarang melalui antarmuka lokalnya, bukan melalui antarmuka jarak jauhnya. Ini meminimalkan overhead jaringan. Kacang sesi Façade merangkum semua logika untuk domain bisnis dan memusatkan transaksi di server. Ini menghasilkan konkurensi yang tinggi.

Dalam aplikasi perbankan kami, kami menggunakan panggilan metode transfer()dengan parameter untuk mentransfer data dari tingkat klien ke tingkat EJB melalui Sesi Façade. Pendekatan ini akan segera lepas kendali untuk aplikasi domain bisnis yang canggih, yang kemungkinan besar akan menangani parameter dalam jumlah besar. Selain itu, kami tidak boleh menggunakan beberapa panggilan halus dengan Façade Sesi untuk mentransfer data massal karena overhead jaringan, yang merupakan salah satu alasan mengapa kami memperkenalkan pola Sesi Façade ke dalam contoh kami di tempat pertama. Alih-alih transfer(), Anda dapat menggunakan pola desain Objek Nilai untuk bertukar data antara klien dan tingkatan EJB melalui kacang sesi Façade Sesi. Sebuah objek nilaiadalah kelas Java yang dapat bersambung yang merangkum data bisnis. Cuplikan kode ini menunjukkan objek nilai AccountTransferValueObject, yang dapat diganti transfer()dalam contoh aplikasi perbankan kami:

public class AccountTransferValueObject mengimplementasikan java.io.Serializable {private String customerPK; Private String fromAccountPK; private String toAccountPK; jumlah float pribadi; ... public String getCustomerPK () {return customerPK; } public String getFromAccountPK () {return fromAccountPK; } public String getToAccountPK () {return toAccountPK; } public float getTransferAmount () {jumlah pengembalian; } public void setCustomerPK (String customerPK) {this.customerPK = customerPK; } public void setFromAccountPK (String fromAccountPK) {this.fromAccountPK = fromAccountPK; } public void setToAccountPK (String toAccountPK) {this.toAccountPK = toAccountPK; } public void setTransferAmount (jumlah float) {this.amount = jumlah; }}

Ketika tingkat klien mengirimkan data ke tingkat EJB untuk diproses, tingkat klien membuat objek nilai untuk membungkus semua informasi yang diperlukan dan mengirim objek ke tingkat EJB melalui antarmuka Sesi Façade. Demikian juga, ketika tingkat klien menerima data dari tingkat EJB, tingkat EJB membuat objek nilai untuk membungkus semua informasi yang dikumpulkan dari kacang entitas, dan mengirimkan objek ke tingkat klien melalui antarmuka Façade Sesi.

Tantangan menggunakan Session Façade dengan Value Object

Untuk domain bisnis yang dipahami dengan baik dan sederhana, Anda dapat dengan mudah menentukan objek nilai. Untuk domain bisnis yang canggih, karena potensi sejumlah besar objek nilai dan persyaratan penyesuaian, tugas ini menjadi semakin rumit, bahkan jika tim analisis dan desain menganalisis domain bisnis secara menyeluruh.

Menggunakan pola Sesi Façade dengan Value Object juga menghadirkan tantangan berikut:

  • Ketika tingkat klien menerima data massal dari tingkat EJB, klien menerima objek nilai atau pengecualian, tetapi tidak keduanya. Dalam aplikasi dunia nyata, terkadang Anda ingin mengambil objek nilai dan pengecualian bisnis dari tingkat EJB. Dari perspektif kinerja, mahal untuk melempar pengecualian bisnis aplikasi setiap kali validasi aturan bisnis gagal pada tingkat EJB. Setiap kali pengecualian dilemparkan, karena objek pengecualian bisnis yang baru dibuat, JVM harus memperbaiki tumpukan panggilan. Pengecualian harus digunakan hanya untuk kondisi kesalahan.
  • Kopling dan ketergantungan antara klien dan tingkatan EJB hanya dikurangi, tidak dihilangkan, sehingga pengembangan paralel dari lapisan aplikasi yang berbeda tidak dapat sepenuhnya dicapai. Tanpa lapisan Façade Sesi, klien harus secara langsung menjalankan metode halus pada komponen EJB sesi / entitas (objek bisnis). Jika objek bisnis perlu diubah di masa depan, maka Anda juga harus mengubah klien. Dengan memperkenalkan lapisan Façade Sesi, Anda mungkin dapat menghindari mengubah klien jika objek bisnis berubah. Akibatnya, kopling dan ketergantungan antara klien dan tingkatan EJB berkurang. Tetapi tingkat klien masih digabungkan dengan tingkat EJB melalui objek nilai. Setiap kali nilai objek berubah, Anda biasanya perlu mengkompilasi ulang kelas tingkat klien. Karena objek nilai cenderung sering berubah,mereka mungkin membuat hambatan yang mengerikan antara klien dan tingkatan EJB, terutama untuk proyek besar yang memiliki banyak objek bernilai.
  • Menggunakan pola Sesi Façade dengan Value Object tidak menawarkan kemampuan jejak audit implisit. Saat aplikasi perusahaan tumbuh semakin rumit, aplikasi yang berbeda perlu berinteraksi satu sama lain. Dengan kapabilitas audit-trail bawaan, sementara permintaan pemrosesan aplikasi berjalan melalui berbagai tingkatan aplikasi atau bahkan aplikasi perusahaan yang berbeda, aktivitas sistem dapat dilacak dan diaudit dengan benar.

XML untuk menyelamatkan

Sebagai alternatif untuk objek nilai, kita akan menggunakan aliran data XML untuk bertukar kumpulan data yang berubah-ubah antara tingkatan melalui kacang sesi Façade Sesi. Skema XML yang disederhanakan ini yang diilustrasikan pada Gambar 3 mendefinisikan struktur, konten, dan semantik dari dokumen XML yang digunakan untuk bertukar kumpulan data antara tingkatan klien dan EJB.

The client tier uses the input node to flexibly package request data that will be sent to the EJB tier for processing. The input node can contain zero or more fieldset nodes; a fieldset node can contain one or more field nodes and zero or more dataset nodes. A field node can have one or more value elements, which contain the actual value for each field. The field node might contain a data array. The nodes fieldset, field, and dataset all have a required name attribute.

The EJB tier uses the output node to send a response back to the client tier. The output node is also flexible. It can send both flat tabular data and hierarchical data back. The main data structure within the output node is the dataset node. output can contain zero or more dataset nodes, which in turn, can have zero or more row nodes and zero or more nested dataset nodes.

The client and EJB tiers exchange information about application business domain-related errors and possible system errors in the errors node. The errors node can contain zero or more error nodes; each error node has a source element, an errorcode element, and a description element. In addition, the error node has a category attribute, which can be one of two possible values: system and business.

The audits node logs the system activities on different tiers or different applications. The audits node can have zero or more audit nodes; and each audit node has both a timestamp and description element.

For the text view of the XML data stream schema, please download the source code. The following code shows a simple XML example using this schema:

   buy Jason Cai JAVA 10000      0 buy 0.00      TradeBean 10001 Stock symbol Java does not exist     

Using XML data stream has the following benefits:

  • The client tier will be able to retrieve both multiple data sets and business validation exceptions from the EJB tier with just one remote call.
  • The XML data stream eliminates the coupling and dependency between the client and EJB tiers, and achieves parallel development. Additionally, using XML results in less custom development. A validating XML parser can use a supplied schema to automatically check an XML data stream's syntax and enforce business rules.

  • The audit-trail capability is built-in.
  • XML data streams are self documenting. XML tags' textual nature and the inclusion of a well-defined schema greatly reduce guesswork during application development.
  • XML memungkinkan perusahaan untuk membuat antarmuka terbuka dan standar untuk sistem yang ada.

Pelaksanaan

Façade Sesi kami dengan implementasi XML, ditunjukkan pada Gambar 4, mendefinisikan tiga antarmuka Java dan kelas abstrak sebagai kelas intinya.

ISessionFacadeantarmuka, seperti yang ditunjukkan dalam cuplikan kode di bawah, mendefinisikan dua process()metode dengan tanda tangan berbeda. Salah satu metode mengambil representasi string dari aliran data masukan XML sebagai parameter masukan dan mengembalikan representasi string dari aliran data keluaran XML. Yang lain mengambil dokumen XML DOM (Document Object Model) sebagai parameter masukannya dan mengembalikan dokumen XML DOM. Baik antarmuka jarak jauh kacang sesi Façade dan kelas kacang harus mengimplementasikan ISessionFacadeantarmuka: